1.Collectors方法实现的种类

Collectors作为一个提供常用collector的静态方法类,里面的有很多公共的静态方法,大多数方法是借助new CollectorImpl来实现的,少数是借助reducing方法来实现的,不过reducing方法最终也是通过new CollectorImpl来实现的,本节先介绍toCollections和joining两类

2.toCollections类

2.1 toList()

这个方法是大家最常用的方法,作用是将流转换成ArrayList,它的组成是

supplier accumulator combiner finisher characteristic
(Supplier<List>) ArrayList::new List::add (left, right) -> { left.addAll(right); return left; } CH_ID
提供的就是一个空的ArrayList容器 是将当前的元素T加入到之前的结果容器ArrayList里 对于两个结果容器,需要保证顺序,所以返回的是两个容器addAll之后的结果 IDENTITY_FINISH,不调用finisher方法,得到ArrayList之后不做多余的转换

2.2 toSet()

这个方法就是将流里面的元素放到一个Set里面,跟toList() 的区别就是容器的类型不一样

supplier accumulator combiner finisher characteristic
(Supplier<Set>) HashSet::new Set::add (left, right) -> { left.addAll(right); return left; } CH_UNORDERED_ID
提供的就是一个空的HashSet容器 是将当前的元素T加入到之前的结果容器HashSet里 对于两个结果容器,返回的是两个容器addAll之后的结果 IDENTITY_FINISH,UNORDERED不调用finisher方法,得到ArrayList之后不做多余的转换,而且操作可以是无序的

2.3 toCollections()

这方法是可以将流里面的元素放到一个集合容器里,具体的什么类型的集合容器需要传参数来决定,因为上面的两个方法是经常会用到的容器的类型所以具体话了,对于其他没有那么经常使用的集合类型,比如LinkedList,TreeSet之类的可以自己传参来定义。
方法签名:

public static <T, C extends Collection<T>>Collector<T, ?, C> toCollection(Supplier<C> collectionFactory)
supplier accumulator combiner finisher characteristic
collectionFactory Collection::add (r1, r2) -> { r1.addAll(r2); return r1; } CH_ID
提供的容器是用户传入的类型,必须是Collection的子类 是将当前的元素T加入到之前的结果容器HashSet里 对于两个结果容器,返回的是两个容器addAll之后的结果 IDENTITY_FINISH,不调用finisher方法,得到ArrayList之后不做多余的转换

3.joing

3.1 joining()

这个方法可以将流中的元素转换成String拼接起来,中间是没有任何符号和空格的
比如:

        Stream<String> stream = Stream.of("hello", "world");System.out.println(stream.collect(Collectors.joining()));

输出:helloworld

先来看这个方法的泛型类型

CollectorImpl<CharSequence, StringBuilder, String>

流中的元素T是CharSequence, 中间结果容器是StringBuilder,最后返回的结果是String类型的

supplier accumulator combiner finisher characteristic
StringBuilder::new StringBuilder::append (r1, r2) -> { r1.append(r2); return r1; } StringBuilder::toString CH_NOID
提供的容器是StringBuilder 是将当前的元素T append到中间的StringBuilder的尾部 对于两个stringBuilder,返回的是两个StringBuilder append之后的结果 最后转换成string Collections.emptySet(),一个空集合,去掉IDENTITY_FINISH是因为这里有finisher方法

3.2 joining(CharSequence delimiter)

这个方法也是将元素拼接成String,泛型类型跟上个方法一样,相比之下多了一个功能,可以传入一个参数,代表两个元素中间用这个分隔符来分开,比如,如果希望中间的两个元素是用“-"分开的,那么这个参数就是“-“

        Stream<String> stream = Stream.of("hello", "world");System.out.println(stream.collect(Collectors.joining("—")));

输出:hello-world
具体的实现是调用了另一个重载的方法,这个方法的第一个参数是delimiter,也就是分隔符,具体的我们再下一个方法介绍

  return joining(delimiter, "", "");

3.3 joining(CharSequence delimiter, CharSequence prefix, charSequence suffix)

这个拼接的方法功能更丰富一点,除了可以自定义分隔符还可以定义前缀和后缀,
比如:

     Stream<String> stream = Stream.of("hello", "world");System.out.println(stream.collect(Collectors.joining("-", "start", "end")));

输出:starthello-worldend

具体的实现是

supplier accumulator combiner finisher characteristic
() -> new StringJoiner(delimiter, prefix, suffix) StringJoiner::add StringJoiner::merge StringJoiner::toString CH_NOID
提供的容器是StringJoiner,所以具体的实现可以去看StringJoiner 是将当前的元素T add到中间的StringJoiner的尾部 对于两个StringJoiner,返回的是两个StringJoiner merge之后的结果 最后转换成string Collections.emptySet()

[Java8新特性]Collectors源码阅读-1 toCollections和joining等相关推荐

  1. Java8 Hashtable 源码阅读

    一.Hashtable 概述 Hashtable 底层基于数组与链表实现,通过 synchronized 关键字保证在多线程的环境下仍然可以正常使用.虽然在多线程环境下有了更好的替代者 Concurr ...

  2. Java8 ArrayBlockingQueue 源码阅读

    一.什么是 ArrayBlockingQueue ArrayBlockingQueue 是 GUC(java.util.concurrent) 包下的一个线程安全的阻塞队列,底层使用数组实现. 除了线 ...

  3. Java8 PriorityQueue 源码阅读

    一.什么是 PriorityQueue 这篇文章带大家去了解一个 jdk 中不常用的数据结构 PriorityQueue(优先队列),虽然在项目里用的不多,但是它本身的设计实现还是很值得大家看一看的. ...

  4. Java8 LinkedHashMap 源码阅读

    如果你对 HashMap 的源码有了解的话,只需要一图就能知道 LinkedHashMap 的原理了,但是具体的实现细节还是需要去读一下源码. 一.LinkedHashMap 简介 1.1 继承结构 ...

  5. 【java8新特性】——Stream API详解(二)

    一.简介 java8新添加了一个特性:流Stream.Stream让开发者能够以一种声明的方式处理数据源(集合.数组等),它专注于对数据源进行各种高效的聚合操作(aggregate operation ...

  6. 放大招了,肝了一篇8万字的Java8新特性总结,赶快收藏

    大家好,我是冰河~~ 说实话,肝这篇文章花了我一个月的时间,关于Java8的新特性全在这儿了,建议先收藏后阅读. Java8有哪些新特性? 简单来说,Java8新特性如下所示: Lambda表达式 函 ...

  7. java8 新特性精心整理(全)——新 Date/Time API

    https://blog.csdn.net/sanri1993/article/details/101176712 前言 越来越多的项目已经使用 Java 8 了,毫无疑问,Java 8 是Java自 ...

  8. 【小家java】java8新特性之---Optional的使用,避免空指针,代替三目运算符

    相关阅读 [小家java]java5新特性(简述十大新特性) 重要一跃 [小家java]java6新特性(简述十大新特性) 鸡肋升级 [小家java]java7新特性(简述八大新特性) 不温不火 [小 ...

  9. 【java8新特性】——lambda表达式与函数式接口详解(一)

    一.简介 java8于2014年发布,相比于java7,java8新增了非常多的特性,如lambda表达式.函数式接口.方法引用.默认方法.新工具(编译工具).Stream API.Date Time ...

最新文章

  1. mysql的proxy机制_MySQL Proxy工作机制浅析
  2. mysql中varchar 大小写敏感问题
  3. 根据文件属性或权限进行find查找
  4. stm32数据手册中文_浅聊STM32系统构架
  5. 收藏丨运维良药,K8S日常故障处理集锦
  6. AttributeError: 'Bunch' object has no attribute 'data'
  7. linux complete函数,Linux驱动中completion接口浅析(wait_for_complete例子,很好)
  8. PHP调整图片饱和度,window_Win10系统电脑屏幕的饱和度如何调整?,什么是饱和度? 对电脑来说 - phpStudy...
  9. python -sorted 学习
  10. hdu4540---DP入门
  11. pytecplot 的安装与启动(tecplot GUI能用但是pytecplot不能用)
  12. 基于asp.net固定资产管理系统设计
  13. 3.3.3 Camelot亚瑟王的宫殿 USACO
  14. 使用kubeadm安装k8s
  15. opencv应用实例-金圣韬-专题视频课程
  16. 爬虫小白入门实例 —— 爬取全国某天所有火车的运行时刻表
  17. Yii Framework 开发教程(41) Zii组件-Tabs示例
  18. 查询数据库中所有表的记录数
  19. 【考研数学】九. 无穷级数
  20. 融云猿桌派开放报名:扶我起来,我能干到36岁

热门文章

  1. 半小时学会LevelDB原理及应用
  2. 什么是埋点?埋点的意义是什么?有哪些用途?
  3. 计算机应届生理论知识面试,计算机应届生面试技巧
  4. 解决 Client.Timeout exceeded while awaiting headers或Docker Pulling fs layer net/http: TLS handshake的方案
  5. 微型计算机原理计算机钢琴,用汇编语言编写计算机钢琴程序.PDF
  6. JAVA程序设计:破解保险箱(LeetCode:753)
  7. 连续两年进入Gartner SFA魔力象限,CRM领头羊销售易做对了什么?
  8. squid缓存服务器 ACL访问控制 传统代理 透明代理 squid日志分析 反向代理
  9. HP Helion让合作伙伴到少增30%收入
  10. Ubuntu下有线连接开无线WIFI的3种方式