文章目录

  • 简介
  • Collectors.toList()
  • Collectors.toSet()
  • Collectors.toCollection()
  • Collectors.toMap()
  • Collectors.collectingAndThen()
  • Collectors.joining()
  • Collectors.counting()
  • Collectors.summarizingDouble/Long/Int()
  • Collectors.averagingDouble/Long/Int()
  • Collectors.summingDouble/Long/Int()
  • Collectors.maxBy()/minBy()
  • Collectors.groupingBy()
  • Collectors.partitioningBy()
  • 总结

java stream中Collectors的用法

简介

在java stream中,我们通常需要将处理后的stream转换成集合类,这个时候就需要用到stream.collect方法。collect方法需要传入一个Collector类型,要实现Collector还是很麻烦的,需要实现好几个接口。

于是java提供了更简单的Collectors工具类来方便我们构建Collector。

下面我们将会具体讲解Collectors的用法。

假如我们有这样两个list:

List<String> list = Arrays.asList("jack", "bob", "alice", "mark");
List<String> duplicateList = Arrays.asList("jack", "jack", "alice", "mark");

上面一个是无重复的list,一个是带重复数据的list。接下来的例子我们会用上面的两个list来讲解Collectors的用法。

Collectors.toList()

List<String> listResult = list.stream().collect(Collectors.toList());log.info("{}",listResult);

将stream转换为list。这里转换的list是ArrayList,如果想要转换成特定的list,需要使用toCollection方法。

Collectors.toSet()

Set<String> setResult = list.stream().collect(Collectors.toSet());log.info("{}",setResult);

toSet将Stream转换成为set。这里转换的是HashSet。如果需要特别指定set,那么需要使用toCollection方法。

因为set中是没有重复的元素,如果我们使用duplicateList来转换的话,会发现最终结果中只有一个jack。

Set<String> duplicateSetResult = duplicateList.stream().collect(Collectors.toSet());log.info("{}",duplicateSetResult);

Collectors.toCollection()

上面的toMap,toSet转换出来的都是特定的类型,如果我们需要自定义,则可以使用toCollection()

List<String> custListResult = list.stream().collect(Collectors.toCollection(LinkedList::new));log.info("{}",custListResult);

上面的例子,我们转换成了LinkedList。

Collectors.toMap()

toMap接收两个参数,第一个参数是keyMapper,第二个参数是valueMapper:

Map<String, Integer> mapResult = list.stream().collect(Collectors.toMap(Function.identity(), String::length));log.info("{}",mapResult);

如果stream中有重复的值,则转换会报IllegalStateException异常:

Map<String, Integer> duplicateMapResult = duplicateList.stream().collect(Collectors.toMap(Function.identity(), String::length));

怎么解决这个问题呢?我们可以这样:

Map<String, Integer> duplicateMapResult2 = duplicateList.stream().collect(Collectors.toMap(Function.identity(), String::length, (item, identicalItem) -> item));log.info("{}",duplicateMapResult2);

在toMap中添加第三个参数mergeFunction,来解决冲突的问题。

Collectors.collectingAndThen()

collectingAndThen允许我们对生成的集合再做一次操作。

List<String> collectAndThenResult = list.stream().collect(Collectors.collectingAndThen(Collectors.toList(), l -> {return new ArrayList<>(l);}));log.info("{}",collectAndThenResult);

Collectors.joining()

Joining用来连接stream中的元素:

String joinResult = list.stream().collect(Collectors.joining());log.info("{}",joinResult);String joinResult1 = list.stream().collect(Collectors.joining(" "));log.info("{}",joinResult1);String joinResult2 = list.stream().collect(Collectors.joining(" ", "prefix","suffix"));log.info("{}",joinResult2);

可以不带参数,也可以带一个参数,也可以带三个参数,根据我们的需要进行选择。

Collectors.counting()

counting主要用来统计stream中元素的个数:

Long countResult = list.stream().collect(Collectors.counting());log.info("{}",countResult);

Collectors.summarizingDouble/Long/Int()

SummarizingDouble/Long/Int为stream中的元素生成了统计信息,返回的结果是一个统计类:

IntSummaryStatistics intResult = list.stream().collect(Collectors.summarizingInt(String::length));log.info("{}",intResult);

输出结果:

22:22:35.238 [main] INFO com.flydean.CollectorUsage - IntSummaryStatistics{count=4, sum=16, min=3, average=4.000000, max=5}

Collectors.averagingDouble/Long/Int()

averagingDouble/Long/Int()对stream中的元素做平均:

Double averageResult = list.stream().collect(Collectors.averagingInt(String::length));log.info("{}",averageResult);

Collectors.summingDouble/Long/Int()

summingDouble/Long/Int()对stream中的元素做sum操作:

Double summingResult = list.stream().collect(Collectors.summingDouble(String::length));log.info("{}",summingResult);

Collectors.maxBy()/minBy()

maxBy()/minBy()根据提供的Comparator,返回stream中的最大或者最小值:

Optional<String> maxByResult = list.stream().collect(Collectors.maxBy(Comparator.naturalOrder()));log.info("{}",maxByResult);

Collectors.groupingBy()

GroupingBy根据某些属性进行分组,并返回一个Map:

Map<Integer, Set<String>> groupByResult = list.stream().collect(Collectors.groupingBy(String::length, Collectors.toSet()));log.info("{}",groupByResult);

Collectors.partitioningBy()

PartitioningBy是一个特别的groupingBy,PartitioningBy返回一个Map,这个Map是以boolean值为key,从而将stream分成两部分,一部分是匹配PartitioningBy条件的,一部分是不满足条件的:

 Map<Boolean, List<String>> partitionResult = list.stream().collect(Collectors.partitioningBy(s -> s.length() > 3));log.info("{}",partitionResult);

看下运行结果:

22:39:37.082 [main] INFO com.flydean.CollectorUsage - {false=[bob], true=[jack, alice, mark]}

结果被分成了两部分。

总结

Collectors是一个非常强大的工具类,希望大家能够灵活使用。

本文的例子https://github.com/ddean2009/learn-java-streams/tree/master/Collectors

更多精彩内容且看:

  • 区块链从入门到放弃系列教程-涵盖密码学,超级账本,以太坊,Libra,比特币等持续更新
  • Spring Boot 2.X系列教程:七天从无到有掌握Spring Boot-持续更新
  • Spring 5.X系列教程:满足你对Spring5的一切想象-持续更新
  • java程序员从小工到专家成神之路(2020版)-持续更新中,附详细文章教程

欢迎关注我的公众号:程序那些事,更多精彩等着您!
更多内容请访问 www.flydean.com

java stream中Collectors的用法相关推荐

  1. js 中转换成list集合_java stream中Collectors的用法

    简介 在java stream中,我们通常需要将处理后的stream转换成集合类,这个时候就需要用到stream.collect方法.collect方法需要传入一个Collector类型,要实现Col ...

  2. java stream中的peek()用法

    文章目录 前言 最终操作(terminal operation) peek() vs forEach() peek() 的典型用法:协助调试 总结 前言 最近看到一段代码: aeFormList.st ...

  3. Java 8中Collectors.groupingBy方法空指针异常源码分析

    现在有这样的一个需求:老板让把所有的员工按年龄进行分组,然后统计各个年龄的人数. 这个需求,如果是在数据库中,可以直接使用一个 group by 语句进行统计即可,那么在 Java 中的话,可以借助于 ...

  4. Java程序中Timer的用法

    Java程序中Timer的用法 import java.io.IOException; import java.util.Timer; public class CheckTimer {/*** @p ...

  5. Java 8中Collectors.toMap空指针异常源码分析

    当需要将一个List转换为Map时,可以使用 Java 8 中的 Collectors.toMap() 方法,Map是由key-value组成的键值对集合,在使用Collectors.toMap() ...

  6. java8中 Collectors.groupingBy用法

    目录 1.数据准备: 2.分组 按照类目分组: 按照几个属性拼接分组: 根据不同条件分组 3.多级分组 4.按子组收集数据 求总数 求和 把收集器的结果转换为另一种类型 联合其他收集器 Collect ...

  7. java项目中enum的用法_java中enum的用法

    本文实例讲述了java中enum的用法.分享给大家供大家参考.具体分析如下: 1. 基本用法 enum Day { SUNDAY, MONDAY, TUESDAY, WENDSDAY, THURSDA ...

  8. java jna_Java中jna的用法

    (1)jna是对jni的封装,让java使用者能更好的使用本地的动态库 (2)使用jna需要下载jna的jar包,该jar包就是对jni的封装,所以在调用效率上来讲,jna是要比jni低一点的,不过对 ...

  9. java stream中的reduce问题

    发现这个问题是因为本来接口需要返回的是业务数据list和合计的object,正常情况下是这样的 本来是没什么问题的,但是当我把数据删到只剩一条时 数据变成了这样(返回数据的时候把reduce返回的ob ...

最新文章

  1. 中奖名单,老读者请看过来!
  2. 在推荐系统中,我还有隐私吗?联邦学习:你可以有
  3. JS模板引擎handlerbars入门
  4. 初探 React Router 4.0
  5. Hd Simpsons’ Hidden Talents
  6. S3C2440中断跳转分析
  7. [深度学习] 自然语言处理 --- Bert开发实战 (Transformers)
  8. java 并发 线程安全_Java并发教程–线程安全设计
  9. 【VS开发】IP地址格式转换(htonl、ntohl;inet_addr、inet_ntoa)
  10. Lucene 和 ElasticSearch 的前世今生
  11. C#3.0 为我们带来什么(3) —— 初始化器
  12. npm 包管理器的使用
  13. Linux_版简易C语言IDE制作
  14. IIS EXPRESS无法启动
  15. 自动生成python接口文档_Django自动生成Swagger接口文档
  16. jquery实现星星闪烁功能
  17. 对区块链钱包的简单认识
  18. GeoGebra 数列极限
  19. 【TM1650】STM8S TM1650芯片控制程序
  20. 腾讯伪原创视频需要改什么好处

热门文章

  1. TCP keepalive的详解(解惑)
  2. FFMPEG音视频解码
  3. 嗅探(被动嗅探)与ARP欺骗(主动嗅探)详解
  4. OpenCV 中的图像处理 004_平滑图像
  5. QUIC 是如何解决TCP 性能瓶颈的?
  6. 经典永驻,重温设计模式 |硬核!
  7. Go http client 连接池不复用的问题
  8. MySQL基础总结(三)
  9. C++中的继承(一)
  10. 电话之父贝尔的传奇一生