Может использовать функциональные операции
Я использую конструкцию 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, поэтому я спрашиваю.
- Что должна делать эта новая линия? Я не видел ничего подобного, в реальной жизни или в классе.
Ответы
Ответ 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()
метод, похоже, не нуждается в объяснении.
Простой, не так ли?