可以使用功能操作

时间:2014-08-14 03:50:03

标签: java function netbeans foreach

我在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;
}
  1. 为什么NetBeans会警告我这个?我知道我不应该盲目地信任IDE,所以这就是我要问的原因。
  2. 那条新线应该做什么?在现实生活中或课堂上,我没有看到类似的东西。

2 个答案:

答案 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()方法似乎不需要解释。

简单,不是吗?