Ответ 1
Попробуйте уменьшить поток, это должно помочь.
Как
listOfIntegers.stream().reduce(1, (a, b) -> a * b)
Эта ссылка содержит дополнительную информацию о том, как использовать сокращение.
Существует ли эквивалентный метод sum() в потоке, который может выполнять умножение значений, заданных в потоке?
У меня есть список целых чисел:
List<Integer> listOfIntegers = new ArrayList<>();
listOfIntegers.addAll(Arrays.asList(1,4,2,7,5));
Я могу получить сумму всех целых чисел, но не могу найти API, который может умножить значения и дать результат.
listOfIntegers.stream().mapToInt(a -> a).sum();
Если я пытаюсь использовать forEach для этого, то я не могу сохранить результат, так как в нем могут использоваться только конечные переменные.
Есть ли альтернатива этому?
Попробуйте уменьшить поток, это должно помочь.
Как
listOfIntegers.stream().reduce(1, (a, b) -> a * b)
Эта ссылка содержит дополнительную информацию о том, как использовать сокращение.
Одна вещь, которую следует иметь в виду при умножении неизвестного числа ints
, - это возможность переполнения. Вместо (a,b) -> a*b
безопаснее использовать Math::multiplyExact
, который генерирует исключение при переполнении:
listOfIntegers.stream().mapToInt(x->x).reduce(1, Math::multiplyExact);
В качестве альтернативы вы можете разместить большие результаты, уменьшив BigInteger
:
listOfIntegers.stream()
.map(BigInteger::valueOf)
.reduce(BigInteger.ONE, BigInteger::multiply);
Сокращение с идентификатором вернет 1
или BigInteger.ONE
, если список пуст, что может быть не таким, каким вы хотите. Если вы хотите обработать случай с пустым списком, удалите первый аргумент reduce
, а затем обработайте полученный Optional
.