【问题标题】:Java 8 stream map reusing assigned variableJava 8流图重用分配的变量
【发布时间】:2014-10-26 05:38:58
【问题描述】:

我知道标题可能有点令人困惑,但我想不出更好的标题,所以让我解释一下我的意思...

我有这段代码:

int spacing = Integer.MAX_VALUE;

for (Edge edge : edges) {
    if (!union.connected(edge.getStart(), edge.getEnd())) {
        spacing = Math.min(spacing, edge.getWeight());
    }
}

有没有办法把这段代码变成java 8代码?

当然,第一步是过滤,这很简单,但它变得更棘手,因为我必须在 Stream::map 方法中重用计算变量spacing,我不知道这是否可能。

【问题讨论】:

  • 请注意,您的代码与java-8 兼容。
  • 当然是...是java 7....不过我想写成java 8风格
  • 您应该澄清这一点。您想使用 Java 8 的 lambda 和函数式样式。
  • 我觉得其实挺清楚的……

标签: java filter mapping java-8 java-stream


【解决方案1】:

我不完全确定语法(我无法测试它),但它应该适用于这样的东西:

int spacing = edges.stream()
                   .filter(edge -> !union.connected(edge.getStart(), edge.getEnd()))
                   .min (Collectors.comparing(Edge::getWeight))
                   .map (Edge::getWeight) // get the weight of the min Edge
                   .orElse(Integer.MAX_VALUE);

不确定传递给min 的比较器。

如果上面的代码不起作用,你可以先mapToInt(假设getWeight()返回int):

int spacing = edges.stream()
                   .filter(edge -> !union.connected(edge.getStart(), edge.getEnd()))
                   .mapToInt(Edge::getWeight)
                   .min ()
                   .orElse(Integer.MAX_VALUE);

【讨论】:

  • 您犯的唯一“错误”是min 返回Optional,因此您需要从中提取实际结果...作为一般解决方案,它是完美的... ty(不能投票因为作为新用户的声誉不佳而上升)
猜你喜欢
  • 1970-01-01
  • 2017-09-13
  • 1970-01-01
  • 2020-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-20
相关资源
最近更新 更多