【问题标题】:Can use functional operations可以使用函数式操作
【发布时间】:2014-10-07 14:45:28
【问题描述】:

我在 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. 那条新行应该做什么?无论是在现实生活中还是在课堂上,我都没有见过这样的事情。

【问题讨论】:

  • 这是新的 Java 8 API 和 lambda 表达式。
  • 你已经更新到 java 8 了吗?
  • 你的 IDE 非常聪明。
  • 这真的是一种改进吗?似乎更难阅读,打字时间更长,而且运行速度也不快。
  • @immibis 不是我不想要它,我正在尝试了解它是什么以及是否适合使用新样式(效率、可维护性问题等)。跨度>

标签: java function netbeans foreach


【解决方案1】:

这看起来像 NetBeans 建议将 sum 操作重构为 Java 8“lambda”或使用 Stream 接口中的 map 和 reduce 函数的函数式编程操作。您必须使用带有 NetBeans 的 Java 8 JDK。

分解它在做什么:

  • “map()”函数正在计算 routes 数组列表中的所有 route 大小,

  • “reduce()”函数然后执行这些单独大小的总和,以获得路径总数的最终结果。

map() 和 reduce() 函数记录在 Java 8 文档中,用于 Stream 接口可用at this link

这个答案解决了“它是什么”,但没有解决“为什么它更好”。我承认我自己仍在学习这些构造。

【讨论】:

    【解决方案2】:

    所以@paisanco 已经解释了每个函数的作用。

    我同意 IDE 建议的修改比原来的更复杂。
    如果让我在原始版本和 IDE 推荐之间进行选择,那么我会选择原始版本。

    但是,对于您的示例,这是一种更简单(并且更受欢迎)的方式。

    public int getNumRStations() {
        return routes.stream().mapToInt(x -> x.size()).sum();
    }
    

    在这种情况下,解释也更简单。
    对于每条路由的元素x,将其改为x.size()并求和。

    x -&gt; x.size() 称为 lambda 表达式或匿名函数。 好像

    int function(x) {
        return x.size();
    }
    

    (我省略了参数类型。类型由Java编译器隐式选择。)
    此函数应用于集合的每个元素。这就是mapToInt(lambda exp) 方法的作用。

    sum() 方法似乎不需要解释。

    很简单,不是吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-31
      • 2017-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-08
      • 1970-01-01
      • 2015-04-18
      相关资源
      最近更新 更多