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);复制代码


推荐阅读