我在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;
}
答案 0 :(得分:15)
看起来NetBeans建议将你的sum操作重构为Java 8&#34; lambda&#34;或使用map接口的函数编程操作和reduce函数。您必须使用带有NetBeans的Java 8 JDK。
打破它的所作所为:
&#34; map()&#34;功能正在对route
数组列表中的所有routes
尺寸进行计数,
&#34; reduce()&#34;然后函数执行这些单独大小的总和,以获得路由总数的最终结果。
map()和reduce()函数记录在可用的Stream接口的Java 8文档中at this link
这个答案解决了&#34;它是什么&#34;但是没有解决为什么它会更好&#34;。我承认自己还在继续学习这些结构。
答案 1 :(得分:8)
所以@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()
方法似乎不需要解释。
简单,不是吗?