【问题标题】:Java Stream<Object> filter and then use the resultsJava Stream<Object> 过滤然后使用结果
【发布时间】:2019-12-21 16:16:48
【问题描述】:

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

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

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

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

注意:graph.edges() 返回一个Stream&lt;Edges&gt;

【问题讨论】:

    标签: java java-8 java-stream


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      如果您需要对 Node 元素执行 void 操作 foo1foo2,对于每条边,您可以这样做:

      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
      

      【讨论】:

      • 我将其标记为正确答案,因为它更优雅,而且它不会创建单独的结构(例如上面的列表)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-15
      • 2021-03-16
      • 1970-01-01
      • 1970-01-01
      • 2019-09-02
      相关资源
      最近更新 更多