Подтвердить что ты не робот

Как умножить значения в списке с использованием потоков java 8

Существует ли эквивалентный метод sum() в потоке, который может выполнять умножение значений, заданных в потоке?

У меня есть список целых чисел:

List<Integer> listOfIntegers = new ArrayList<>();
listOfIntegers.addAll(Arrays.asList(1,4,2,7,5));

Я могу получить сумму всех целых чисел, но не могу найти API, который может умножить значения и дать результат.

listOfIntegers.stream().mapToInt(a -> a).sum();

Если я пытаюсь использовать forEach для этого, то я не могу сохранить результат, так как в нем могут использоваться только конечные переменные.

Есть ли альтернатива этому?

4b9b3361

Ответ 2

Одна вещь, которую следует иметь в виду при умножении неизвестного числа 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.