如何计算流过滤器上的匹配?

时间:2015-03-25 15:45:34

标签: java java-8 java-stream

如何计算流过滤器的匹配?我正在尝试将以下代码重构为java8 stream

//java7
int i = 0;
for (Node node : response.getNodes()) {
    Integer id = node.getId();
    if (id != null) {
        node.setContent("This is the id: " + id);
        i++;
    }
}

//java8
response.getNodes().stream()
    .filter(node -> node.getId() != null)
    .forEach(node -> node.setValue("This is the id: " + node.getId()));

我现在如何获得已应用的已过滤元素的数量? Sidequestion:在旧代码中,我可以多次重用Integer id。我怎么能用流来实现同样的目标呢?

1 个答案:

答案 0 :(得分:19)

由于setValue是副作用功能,您可以使用peek

long i = response.getNodes()
                 .stream()
                 .filter(node -> node.getId() != null)
                 .peek(node -> node.setValue("This is the id: " + node.getId()))
                 .count();

我不是这种方法的粉丝,因为峰值用于调试目的(这可以解决问题)。请注意,在Java 9中,count()可能无法执行流管道,如果它可以直接从源计算计数(我不认为这是在这里的情况,因为你申请过滤,但记住这一点很好。

  

Sidequestion:在旧代码中我可以重用Integer id multiple   倍。我怎么能用流来实现同样的目标呢?

这取决于您的用例,因为API没有元组,您最好的机会是创建一个类,让我们说Tuple2,这样您就可以将每个节点映射到一个新的元组并重用id。

类似的东西:

.stream().map(node -> new Tuple2<>(node, node.getId()).moreStreamOps(...);
                                                      ^
                                                      |
                 at that point you have a Stream<Tuple2<Node, Integer>> 
                 from which you can grab the id with Tuple2#getSecond

在您的情况下,如果您使用节点流,则可以随时使用getId()获取ID。