可以使用函数式操作



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

很简单,不是吗?

相关内容

  • 没有找到相关文章

最新更新