首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何统计流过滤器上的匹配项?

如何统计流过滤器上的匹配项?
EN

Stack Overflow用户
提问于 2015-03-25 23:45:34
回答 1查看 35.1K关注 0票数 19

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

代码语言:javascript
运行
复制
//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()));

现在如何才能获得已应用的过滤元素的计数?旁问:在旧代码中,我可以多次重用Integer id。如何在streams中实现相同的功能?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-25 23:49:25

由于setValue是一个副作用函数,因此可以使用peek

代码语言:javascript
运行
复制
long i = response.getNodes()
                 .stream()
                 .filter(node -> node.getId() != null)
                 .peek(node -> node.setValue("This is the id: " + node.getId()))
                 .count();

我不是这种方法的粉丝,因为peak是为了调试目的而使用的(这就可以做到这一点)。请注意,在Java9中,如果count()可以直接从源代码计算计数,那么它可能不能执行流管道(我认为这里不是这样,因为您应用了过滤,但最好记住这一点)。

Integer旁问:在旧代码中,我可以多次重用

id。如何在streams中实现相同的功能?

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

类似于:

代码语言:javascript
运行
复制
.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。

票数 28
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29260288

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档