我在Java中使用for-each结构如下:
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,所以这就是我问的原因。这条新线应该做什么?无论是在现实生活中还是在课堂上,我都没有见过这样的事情。
这看起来像是NetBeans建议将sum操作重构为Java 8"lambda"或使用来自Stream接口的map和reduce函数的函数式编程操作。你必须使用Java 8 JDK和NetBeans。
分解它在做什么:
-
"map()"函数正在执行
routes
数组列表中所有route
大小的计数, -
"reduce()"函数然后对这些单独的大小进行求和,以得到路由总数的最终结果。
map()和reduce()函数在Java 8文档中有关于Stream接口的文档记录
这个答案说明了"它是什么",但没有说明"为什么它更好"。我承认我自己还在学习这些结构。
@paisanco已经解释了每个函数的作用。
我同意IDE建议的修改比原来的更复杂。
如果让我在原来的推荐和IDE的推荐中选择一个,我会选择原来的。
然而,对于你的例子,这里有一个更简单(也是更受欢迎)的方法。
public int getNumRStations() {
return routes.stream().mapToInt(x -> x.size()).sum();
}
在这种情况下,解释也更简单。
将各路由元素x
改为x.size()
,并求和。
x -> x.size()
称为lambda表达式或匿名函数。就像
int function(x) {
return x.size();
}
(我省略了参数类型。该类型由Java编译器隐式选择。)
此函数应用于集合的每个元素。这就是mapToInt(lambda exp)
方法的作用。
sum()
方法似乎不需要解释。