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

Sve*_*dak 2 java mapping filter 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());
    }
}
Run Code Online (Sandbox Code Playgroud)

有没有办法将此代码转换为java 8代码?

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

Era*_*ran 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);
Run Code Online (Sandbox Code Playgroud)

不确定比较器传递给min.

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

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