Java 8流映射重用分配的变量

时间:2014-09-02 02:57:41

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

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

我有这段代码:

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,我不知道是否可能。

1 个答案:

答案 0 :(得分:5)

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

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);