Java9 Stream Collectors新增功能(小结)
Java9StreamCollectors新增功能
Java8引入Collectors,用于累加输入元素至可变的容器如,Map、List以及Set。本文看看Java9新增的两个Collectors:Collectors.filtering和Collectors.flatMapping,主要用于和Collectors.groupingBy一起提供智能的元素集合.
Collectors.filtering方法
Collectors.filtering方法类似于Streamfilter()方法,后者用于过滤输入元素,但两者的使用场景不同。Streamfilter()在stream链接方法中使用,而Collectors.filtering方法被设计和groupingBy一起使用。
Streamfilter()首先过滤元素,然后再分组。被过滤的值被丢弃无法被追溯跟踪。如果需要跟踪需要先分组然后再过滤,这正是Collectors.filtering能做的。
Collectors.filtering带函数参数用于过滤输入参数,然后收集过滤元素:
@Test publicvoidgivenList_whenSatifyPredicate_thenMapValueWithOccurences(){ Listnumbers=List.of(1,2,3,5,5); Map result=numbers.stream() .filter(val->val>3) .collect(Collectors.groupingBy(i->i,Collectors.counting())); assertEquals(1,result.size()); result=numbers.stream() .collect(Collectors.groupingBy(i->i, Collectors.filtering(val->val>3,Collectors.counting()))); assertEquals(4,result.size()); }
Collectors.flatMapping方法
Collectors.flatMapping类似于Collectors.mapping方法,但粒度更细。两者都带一个函数和一个收集器参数用于收集元素,但flatMapping函数接收元素流,然后通过收集器进行累积操作。首先我们看模型类:
classBlog{ privateStringauthorName; privateListcomments=newArrayList<>(); publicBlog(StringauthorName,String...comment){ this.authorName=authorName; comments.addAll(Arrays.asList(comment)); } publicStringgetAuthorName(){ returnthis.authorName; } publicList getComments(){ returncomments; } }
Collectors.flatMapping方法跳过中间集合,直接写至单个有Collectors.groupingBy定义的组映射容器中:
@Test publicvoidgivenListOfBlogs_whenAuthorName_thenMapAuthorWithComments(){ Blogblog1=newBlog("1","Nice","VeryNice"); Blogblog2=newBlog("2","Disappointing","Ok","Couldbebetter"); Listblogs=List.of(blog1,blog2); Map >>authorComments1=blogs.stream() .collect(Collectors.groupingBy(Blog::getAuthorName, Collectors.mapping(Blog::getComments,Collectors.toList()))); assertEquals(2,authorComments1.size()); assertEquals(2,authorComments1.get("1").get(0).size()); assertEquals(3,authorComments1.get("2").get(0).size()); Map >authorComments2=blogs.stream() .collect(Collectors.groupingBy(Blog::getAuthorName, Collectors.flatMapping(blog->blog.getComments().stream(), Collectors.toList()))); assertEquals(2,authorComments2.size()); assertEquals(2,authorComments2.get("1").size()); assertEquals(3,authorComments2.get("2").size()); }
Collectors.mapping映射所有分组(作者的评论)值收集的器容器中,如List。并且删除中间集合,直接存储集合至收集器的容器。
总结
本文介绍Java9提供Collectors新的方法。Collectors.filtering()和Collectors.flatMapping(),一般和Collectors.groupingBy()一起使用。
这些收集器也可以与collector.partitioningby()一起使用,但是仅根据条件创建两个分区,收集器的实际功能并没有得到利用;因此在本教程中没有提到。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。