我不明白如何使用过滤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>
。
如果需要在foo1
元素上执行空操作foo2
和Node
,则对于每个边,都可以按照以下步骤进行:
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
您可以通过某些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());
除了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;
});