Java Stream 过滤器,然后使用结果

问题描述 投票:1回答:2

我不明白如何使用过滤Stream <>的结果。示例:

Stream<Edge> edgesStr = graph.edges().filter(edge -> edge.getNode1() == graph.getNode(ip2));

以上成功(?)过滤Edge流,仅保留getNode()方法相等的那些边缘。现在,在此之后,我想使用这些结果,例如:

//for each result
Node node = edgeStr.getNode(); //method getNode() exists for objects Edge
foo1(Node);
foo2(Node);

注意:graph.edges()返回Stream<Edges>

java java-8 java-stream
2个回答
2
投票

如果需要在foo1元素上执行空操作foo2Node,则对于每个边,都可以按照以下步骤进行:

graph.edges()
     .filter(edge -> edge.getNode() == graph.getNode(ip2))
     .map(edge -> edge.getNode()) // map edge to corresponding Node
     .forEach(node -> { foo1(node); foo2(node);}); // calls foo1 and foo2 on each node

3
投票

您可以通过某些collect方法(即当收集到Collector中时的toList)来List结果。为了从Node中提取Edge,可以使用map

List<Node> edges = graph.edges()
    .filter(edge -> edge.getNode1() == graph.getNode(ip2))
    .map(edge -> edge.getNode())
    .collect(Collectors.toList());

0
投票

除了Naman提出的解决方案,如果要严格避免在一个peek中调用多个方法,也可以使用forEach:>

graph.edges()
     .filter(edge -> edge.getNode() == graph.getNode(ip2))
     .map(edge -> edge.getNode()) // map edge to corresponding Node
     .peek(this::foo1) // Use either a method reference to call the method 
     .peek(node -> foo2(node)); // Or a lambda

作为偷看的简短说明:

.peek(this::foo1);

// is somewhat equivalent to

.map(node -> {
    this.foo1(node);
    return node;
});
© www.soinside.com 2019 - 2024. All rights reserved.