JAVA研发狄仁杰 5万字:Stream和Lambda表达式最佳实践2( 二 )
duplicateList=Arrays.asList("jack","jack","alice","mark");复制代码
上面一个是无重复的list , 一个是带重复数据的list 。 接下来的例子我们会用上面的两个list来讲解Collectors的用法 。 9.1Collectors.toList()List
listResult=list.stream().collect(Collectors.toList());log.info("{}",listResult);复制代码
将stream转换为list 。 这里转换的list是ArrayList , 如果想要转换成特定的list , 需要使用toCollection方法 。 9.2Collectors.toSet()Set
setResult=list.stream().collect(Collectors.toSet());log.info("{}",setResult);复制代码
toSet将Stream转换成为set 。 这里转换的是HashSet 。 如果需要特别指定set , 那么需要使用toCollection方法 。
因为set中是没有重复的元素 , 如果我们使用duplicateList来转换的话 , 会发现最终结果中只有一个jack 。 Set
duplicateSetResult=duplicateList.stream().collect(Collectors.toSet());log.info("{}",duplicateSetResult);复制代码9.3Collectors.toCollection()
上面的toMap,toSet转换出来的都是特定的类型 , 如果我们需要自定义 , 则可以使用toCollection()List
custListResult=list.stream().collect(Collectors.toCollection(LinkedList::new));log.info("{}",custListResult);复制代码
上面的例子 , 我们转换成了LinkedList 。 9.4Collectors.toMap()
toMap接收两个参数 , 第一个参数是keyMapper , 第二个参数是valueMapper:Map
mapResult=list.stream().collect(Collectors.toMap(Function.identity(),String::length));log.info("{}",mapResult);复制代码
如果stream中有重复的值 , 则转换会报IllegalStateException异常:Map
duplicateMapResult=duplicateList.stream().collect(Collectors.toMap(Function.identity(),String::length));复制代码
怎么解决这个问题呢?我们可以这样:Map
duplicateMapResult2=duplicateList.stream().collect(Collectors.toMap(Function.identity(),String::length,(item,identicalItem)->item));log.info("{}",duplicateMapResult2);复制代码
【JAVA研发狄仁杰 5万字:Stream和Lambda表达式最佳实践2】在toMap中添加第三个参数mergeFunction , 来解决冲突的问题 。 9.5Collectors.collectingAndThen()
collectingAndThen允许我们对生成的集合再做一次操作 。 List
collectAndThenResult=list.stream().collect(Collectors.collectingAndThen(Collectors.toList(),l->{returnnewArrayList<>(l);}));log.info("{}",collectAndThenResult);复制代码9.6Collectors.joining()
Joining用来连接stream中的元素:StringjoinResult=list.stream().collect(Collectors.joining());log.info("{}",joinResult);StringjoinResult1=list.stream().collect(Collectors.joining(""));log.info("{}",joinResult1);StringjoinResult2=list.stream().collect(Collectors.joining("","prefix","suffix"));log.info("{}",joinResult2);复制代码
可以不带参数 , 也可以带一个参数 , 也可以带三个参数 , 根据我们的需要进行选择 。 9.7Collectors.counting()
counting主要用来统计stream中元素的个数:LongcountResult=list.stream().collect(Collectors.counting());log.info("{}",countResult);复制代码9.8Collectors.summarizingDouble/Long/Int()
SummarizingDouble/Long/Int为stream中的元素生成了统计信息 , 返回的结果是一个统计类:IntSummaryStatisticsintResult=list.stream().collect(Collectors.summarizingInt(String::length));log.info("{}",intResult);复制代码
推荐阅读
- 检测|辽宁派16支核酸检测医疗队驰援大连,研发10合1混采技术
- 车家号|起亚能否依靠电动化迎来转机?,布局未来研发纯电动SUV
- 辽宁:派出16支核酸检测医疗队驰援大连 创新研发10合1混采检测技术
- Galaxy|Galaxy Note 20首发!三星研发全新UWP技术:传输速度比NFC更快
- 科技创新板|康希诺港股涨幅高达1190.5%,如今登陆A股募集10亿用于疫苗研发
- 北斗|中国自主研发的北斗卫星 “心脏”精度:每三百万年差1秒
- 采埃孚|变速箱巨头采埃孚不再研发内燃机部件:将聚焦于插混和纯电驱动单元
- 县域|百强县上市公司研发投入创新高 中部崛起趋势明显
- 引领先锋|Java工程师福利!1分钟学会使用Aspose.PDF将PDF转换为PPT / PPTX
- 移动网络亚洲首富重磅官宣!获美科技巨头千亿元投资:成功研发出顶级5G技术