简介

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

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

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

假如我们有这样两个list:

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

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

Collectors.toList()

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

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

Collectors.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);

Collectors.toCollection()

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

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

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

Collectors.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);

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

Collectors.collectingAndThen()

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

List 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 maxByResult = list.stream().collect(Collectors.maxBy(Comparator.naturalOrder()));        log.info("{}",maxByResult);

Collectors.groupingBy()

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

Map> 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> 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是一个非常强大的工具类,希望大家能够灵活使用。

欢迎关注我的公众号:程序那些事,更多精彩等着您!

更多内容请访问:flydean的博客 flydean.com

js 中转换成list集合_java stream中Collectors的用法相关推荐

  1. 中转换成list集合_Java集合、数组与泛型中的几个陷阱,你掉进了几个?

    来源:苦逼的码农(ID:di201805) 下面我总结了集合.泛型.数组转集合等一些常见的陷进,认真看完,相信你绝对有所收获. 1.List ,List> 与 List 有区别吗? 说实话,我敢 ...

  2. js 中转换成list集合_程序员:java集合介绍-List,具说很详细,你不来看看?

    Java集合介绍 作为一个程序猿,Java集合类可以说是我们在工作中运用最多.最频繁的类.相比于数组(Array)来说,集合类的长度可变,更加方便开发. Java集合就像一个容器,可以存储任何类型的数 ...

  3. 将JSON格式的字符串转换成List集合引入gson 的jar包

    将JSON格式的字符串转换成List集合 排错 IDEA中java文件出现小黄色的J . 打开项目工程的工程结构设置(快捷键:ctrl+alt+shift+s),如图中所示 . . 选择第一栏的Mod ...

  4. FastJson 中 jsonArray 转换成 list 集合的方法

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 今天在写代码时候,遇到了需要将json文本改成jsonobject对象,然后将jsonobject对 ...

  5. SearchHit转成java对象_Java开发中最常犯的10个错误,你中招了吗?

    http://www.programcreek.com/2014/05/top-10-mistakes-java-developers-make/ 阅读目录 Array转ArrayList 判断一个数 ...

  6. js html转为实体,字符串js编码转换成实体html编码的方法(防范XSS攻击)

    js代码在html页面中转换成实体html编码的方法一: js代码转换成实体html js代码转换成实体html--红 function test(){ alert('测试红') } test(); ...

  7. 前端js html转换成pdf可下载打印;前端js可批量生成条形码;前端js可批量生成二维码,生成letter标签

    注意:本文调试的是letter纸尺寸 前端js html转换成pdf可下载打印  html2canvas  + jspdf 前端js生成条形码 Options · lindell/JsBarcode ...

  8. JS字符串转换成数字的三种经典方法和代码实例

    1. 转换函数: js提供了parseInt()和parseFloat()两个转换函数.前者把值转换成整数,后者把值转换成浮点数.只有对String类型调用这些方法,这两个函数才能正确运行: 对其他类 ...

  9. 表情转html,将jquery.qqFace.js表情转换成微信的字符码

    jquery.qqFace.js使用方法 引用 html 初始化 $(function () { $('.emotion').qqFace({ id: 'facebox', assign: 'sayt ...

最新文章

  1. Mybatis插件原理和PageHelper结合实战分页插件(七)
  2. 十二、springboot 详解RestControllerAdvice(ControllerAdvice)
  3. scipy.spatial.distance 与 sklearn cosine_similarity
  4. python代码壁纸-python设置windows桌面壁纸的实现代码
  5. 安装仪表盘控件Iocomp会遇到的几个常见问题
  6. 解读ImageView的wrap_content和adjustViewBounds的工作原理
  7. API标准化成为技术团队面临的最大挑战
  8. 使用JBoss EAP 7的HTTP / 2
  9. appium+python+iOS 环境搭建与使用中常见问题的解决方案链接
  10. java 多态性 变量_java – 与实例变量的多态性
  11. Java Web 项目SSO实战二之(win7 and Windows server 2008)
  12. eclipse中点不出来提示
  13. (Singleton)单例模式的Java实现
  14. 升级这十点认知,你就是大佬!
  15. STM32驱动直流电机的程序与电路设计(IR2110S自举电路+H桥+高级定时器和死区PWM)
  16. 深层网络梯度消失-爆炸原因
  17. python的print与sys.stdout
  18. Android Studio修改工程项目名称以及修改包名
  19. Latex改变页边距
  20. ArrayList和LinkedList的底层源码之我见

热门文章

  1. 最新发布| Jira官宣中国区本地部署特殊政策,公布Data Center价格
  2. 远程办公,团队如何高效沟通与协作
  3. 拆解交易系统--模块拆解与服务化
  4. C++调用Python
  5. Windows 10安装Tensorflow
  6. 进程状态控制-进程的阻塞和唤醒
  7. JVM---对象的实例化内存布局与访问定位
  8. 计算机应用基础 试卷分析,高中政治试卷分析.doc
  9. 单链表-单链表拆分为两个线性表(尾插法+尾插法)
  10. 图解深度学习(图灵出品)