Хобрук: Ваш путь к мастерству в программировании

Как найти сумму делителей с помощью потоков Java?

Я пытаюсь преобразовать эту функцию для использования нового синтаксиса 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, по-видимому, не рекомендуется зацикливаться с использованием лямбда-выражений.


  • Можете ли вы поделиться, как вы пытались решить проблему? 07.04.2020
  • Действительно? sum = Integer.sum(sum, i); вместо sum = sum + i; или sum += i;? 08.04.2020
  • @Holger Я прочитал это где-то в чьем-то коде и подумал, что это круто! Есть и этот. max = Math.max(4, 5). Потрясающе, правда? 08.04.2020
  • Math.max(a, b) можно считать упрощением по сравнению с a >= b? a: b, не говоря уже о необходимом коде для случая с плавающей запятой, в отличие от Integer.sum(a, b) и a + b. 08.04.2020
  • @Holger sum = Integer.sum(sum, a) выглядит более читабельно по сравнению с sum += a. Не нужно понимать +=. Вы можете прочитать это на простом английском языке: целое число, затем суммируйте их. Специально для англоговорящих, которые читают слева направо. += больше похоже на чтение справа налево. И для этого нет английского слова AFAIK 08.04.2020
  • Поскольку порядок операндов для сложения не имеет значения, нет смысла обсуждать, читается ли он слева направо или справа налево. Это назначение справа налево, во всех этих случаях. И если вам не нравится оператор +=, просто используйте обычный +. 08.04.2020

Ответы:


1

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

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

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

07.04.2020

2

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

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

3

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

int sum = IntStream.rangeClosed(1, n).filter(i -> n % i == 0).sum();
07.04.2020
  • потому что он реализует правильный интерфейс? кроме шуток, я тоже не понимаю. 07.04.2020
  • .. или я не указал это в методе. это заставляет меня сомневаться в своих способностях писать код Java: / Мне действительно хотелось бы знать, есть ли что-то не так в моем ответе 07.04.2020
  • не. двигаться дальше. привыкайте к случайным отрицательным отзывам, без комментариев, они означают НОЛЬ или, по крайней мере, должны соответствовать вашим личным ощущениям. 07.04.2020
  • @Nikolas Может быть, если вам интересно, почему я не принял ваш ответ по сравнению с ответом MyStackRunnethOver, который ответил позже, это произошло потому, что SO продолжал отказываться от вашего ответа, говоря, что я должен подождать. Когда MyStackRunnethOver опубликовал его, он был намного более описательным. 08.04.2020

  • 4

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

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

    or

    int sum1 = java.util.stream.IntStream.range(1, n + 1).filter(x -> n % x == 0).sum();
    
    07.04.2020
    Новые материалы

    Решения DBA Metrix
    DBA Metrix Solutions предоставляет удаленного администратора базы данных (DBA), который несет ответственность за внедрение, обслуживание, настройку, восстановление базы данных, а также другие..

    Начало работы с Блум
    Обзор и Codelab для генерации текста с помощью Bloom Оглавление Что такое Блум? Некоторые предостережения Настройка среды Скачивание предварительно обученного токенизатора и модели..

    Создание кнопочного меню с использованием HTML, CSS и JavaScript
    Вы будете создавать кнопочное меню, которое имеет состояние наведения, а также позволяет вам выбирать кнопку при нажатии на нее. Финальный проект можно увидеть в этом Codepen . Шаг 1..

    Внедрите OAuth в свои веб-приложения для повышения безопасности
    OAuth — это широко распространенный стандарт авторизации, который позволяет приложениям получать доступ к ресурсам от имени пользователя, не раскрывая его пароль. Это позволяет пользователям..

    Классы в JavaScript
    class является образцом java Script Object. Конструкция «class» позволяет определять классы на основе прототипов с чистым, красивым синтаксисом. // define class Human class Human {..

    Как свинг-трейдеры могут использовать ИИ для больших выигрышей
    По мере того как все больше и больше профессиональных трейдеров и активных розничных трейдеров узнают о возможностях, которые предоставляет искусственный интеллект и машинное обучение для улучшения..

    Как построить любой стол
    Я разработчик программного обеспечения. Я люблю делать вещи и всегда любил. Для меня программирование всегда было способом создавать вещи, используя только компьютер и мое воображение...