Java 可以使用功能操作
我在Java中使用for each构造,如下所示:Java 可以使用功能操作,java,function,netbeans,foreach,Java,Function,Netbeans,Foreach,我在Java中使用for each构造,如下所示: public int getNumRStations() { int numRoutes = 0; for (ArrayList<Route> route : routes) { numRoutes += route.size(); } return numRoutes; } 为什么NetBeans会警告我这一点?我知道我不应该盲目相信IDE,所以这就是我为什么要问的原因 那条新
public int getNumRStations() {
int numRoutes = 0;
for (ArrayList<Route> route : routes) {
numRoutes += route.size();
}
return numRoutes;
}
这看起来像是NetBeans建议使用流接口中的map和reduce函数将sum操作重构为Java8“lambda”或函数编程操作。您必须将Java8JDK与NetBeans一起使用 分解它正在做的事情:
- “map()”函数正在对
数组列表中的所有路由
大小进行计数路由
- 然后,“reduce()”函数将执行这些单个大小的总和,以获得路由总数的最终结果
这个答案涉及“它是什么”,但没有涉及“为什么它更好”。我承认自己仍在学习这些构造。因此@paisanco已经解释了每个函数的作用 我同意IDE建议的修改比原来的更复杂。
如果我被要求在原始版本和IDE推荐版本之间进行选择,那么我将选择原始版本 然而,对于您的示例,这里有一种更简单(更受欢迎)的方法
public int getNumRStations() {
return routes.stream().mapToInt(x -> x.size()).sum();
}
在这种情况下,解释也更简单。对于每个routes的元素
x
,将其更改为x.size()
,并将其相加
x->x.size()
称为lambda表达式或匿名函数。
就像
int function(x) {
return x.size();
}
(我省略了参数类型。该类型由Java编译器隐式选择。)此函数应用于集合的每个元素。这就是
mapToInt(lambda exp)
方法所做的
sum()
方法似乎不需要解释
很简单,不是吗?这是新的Java 8 API和lambda表达式。您已经更新到Java 8了吗?您的IDE非常智能。这实际上是一种改进吗?似乎更难阅读,打字时间更长,而且运行速度也不快。@immibis这并不是我不想要它,我正在尝试了解它是什么,以及是否适合使用新样式(效率、可维护性问题等)。
int function(x) {
return x.size();
}