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

Может использовать функциональные операции

Я использую конструкцию for-each в Java следующим образом:

public int getNumRStations() {
    int numRoutes = 0;

    for (ArrayList<Route> route : routes) {
        numRoutes += route.size();
    }

    return numRoutes;
}

NetBeans показывает предупреждение/уведомление, в котором говорится: "Может использовать функциональные операции". После автоматического его разрешения вновь созданный код показывает это:

public int getNumRStations() {
    int numRoutes = 0;

    numRoutes = routes.stream().map((route) -> route.size()).reduce(numRoutes, Integer::sum);

    return numRoutes;
}
  • Почему NetBeans предупреждает меня об этом? Я знаю, что я не должен слепо доверять IDE, поэтому я спрашиваю.
  • Что должна делать эта новая линия? Я не видел ничего подобного, в реальной жизни или в классе.
4b9b3361

Ответ 1

Это похоже на NetBeans, предлагающий рефакторинг вашей операции суммирования как операции Java лямбда или функционального программирования с использованием карты и сокращения функций из интерфейса Stream. Вы должны использовать Java 8 JDK с NetBeans.

Нарушение того, что он делает:

  • функция "map()" выполняет подсчет всех ваших размеров route в списке массивов routes,

  • функция "reduce()" затем выполняет сумму этих индивидуальных размеров, чтобы получить окончательный результат для общего количества маршрутов.

Функции map() и reduce() документируются в документации по Java 8 для доступного интерфейса Stream по этой ссылке

В этом ответе рассматривается "что это такое", но не рассматривается "почему это лучше". Я соглашусь до сих пор изучать эти конструкции самостоятельно.

Ответ 2

Итак, @paisanco уже объяснил, что делает каждая функция.

Я согласен, что модификация, предложенная IDE, более сложна, чем оригинал.
Если бы меня попросили выбрать между оригинальным и рекомендацией IDE, тогда я выберу оригинал.

Однако, это более простой (и более предпочтительный) способ для вашего примера.

public int getNumRStations() {
    return routes.stream().mapToInt(x -> x.size()).sum();
}

Объяснение в этом случае проще.
Для каждого элемента маршрута x измените его на x.size() и суммируйте.

x -> x.size() называется лямбда-выражением или анонимной функцией. Это нравится

int function(x) {
    return x.size();
}

(я пропустил тип параметра. Тип неявно выбран компилятором Java.)
Эта функция применяется к каждому элементу коллекции. Это метод mapToInt(lambda exp).

sum() метод, похоже, не нуждается в объяснении.

Простой, не так ли?