Есть ли способ в Stream получить SUM в качестве промежуточной операции - PullRequest
3 голосов
/ 13 января 2020

As Sum, Collect & reduce - терминальные операции. Есть ли способ сравнить результат суммы в потоке, чтобы вернуть логическое значение из потока.

Я написал фрагмент кода ниже, чтобы найти Perfect Number. И все, чего не хватает, это последняя строка для сравнения, если SUM = заданное число

    private static boolean isPerfectNumber(int number) {
            return IntStream.range(1, number / 2 + 1)
                            .filter(e -> number % e == 0)
                            .reduce(Integer::sum)
                            .equals(number); // This Line won't give correct result because I'm comaring an OptionalInt to a Integer instead of optional value.
    } 

Есть ли способ достичь этого в этом одном потоке, или мне нужно сравнить результат отдельно

1 Ответ

4 голосов
/ 13 января 2020

Используйте IntStream#sum, который использует перегруженный reduce API сам по себе:

return IntStream.range(1, number / 2 + 1)
                .filter(e -> number % e == 0)
                .sum() == number; // same as reduce(0, Integer::sum)

Выполните orElse, а затем сравните целочисленные значения -

.reduce(Integer::sum).orElse(0) == number;

Выполните equals среди OptionalInt как

.reduce(Integer::sum)
.equals(OptionalInt.of(number))
...