Как найти сумму делителей, используя Java потоков? - PullRequest
2 голосов
/ 07 апреля 2020

Я пытаюсь преобразовать эту функцию, чтобы использовать Java 8 новый синтаксис. Надеюсь, это уменьшит количество строк и, возможно, прояснит ситуацию.

public int divisorSum(int n) {
    int sum = 0;
    for(int i = 1; i <= n; i ++) {
        if(n % i == 0) {
            sum = Integer.sum(sum, i);
        }
    }
    return sum;
}

Я пробовал это:

IntStream.range(0, n).forEach(i -> ... )

Но согласно комментарию к Tezra этого поста, очевидно, не рекомендуется l oop использовать лямбды .

Ответы [ 4 ]

5 голосов
/ 07 апреля 2020

Вот реализация Java 8 потоков:

public int divisorSum(int n) {
    return IntStream.rangeClosed(1, n).filter(i -> n % i == 0).sum();
}

Обратите внимание, что rangeClosed, как и ваш пример, включает n. range() исключает второй параметр (он будет включать только до n-1).

4 голосов
/ 07 апреля 2020

Вы можете сделать что-то вроде этого

public static int divisorSum(int n) {
    return IntStream.rangeClosed(1, n)
            .filter(i -> n % i == 0)
            .sum();
}
3 голосов
/ 07 апреля 2020

Вы можете достичь того же результата, используя IntStream, filter и IntStream::sum, которые напрямую возвращают int, поскольку этот поток распакован:

int sum = IntStream.rangeClosed(1, n).filter(i -> n % i == 0).sum();
1 голос
/ 07 апреля 2020

Это может быть полезно.

int sum1 = java.util.stream.IntStream.range(1, n + 1).filter(x -> n % x == 0).reduce(0, (x, y) -> x + y);

или

int sum1 = java.util.stream.IntStream.range(1, n + 1).filter(x -> n % x == 0).sum();
...