Java 8 - 收集器Collectors
文章目录
- Pre
- 简介
- 收集器用作高级归约
- 预定义收集器
Pre
我们前面学到了,流可以用类似于数据库的操作帮助你处理集合。
它们支持两种类型的操作:
中间操作(如 filter 或 map )
终端操作(如 count 、 findFirst 、 forEach 和 reduce )
中间操作可以链接起来,将一个流转换为另一个流。这些操作不会消耗流,其目的是建立一个流水线。
与此相反,终端操作会消耗流,以产生一个最终结果,例如返回流中的最大元素。它们通常可以通过优化流水线来缩短计算时间。
前面使用过了collect 终端操作了,当时主要是用来把 Stream 中所有的元素结合成一个 List 。
我们学习完收集器以后,会知道collect 是一个归约操作,就像 reduce 一样可以接受各种做法作为参数,将流中的元素累积成一个汇总结果。具体的做法是通过定义新的Collector 接口来定义的,因此区分 Collection 、 Collector 和 collect 是很重要的。
举几个例子,先感受下
- 对一个交易列表按货币分组,获得该货币的所有交易额总和(返回一个
Map<Currency,Integer>
) - 将交易列表分成两组:贵的和不贵的(返回一个
Map<Boolean, List<Transaction>>
) - 创建多级分组,比如按城市对交易分组,然后进一步按照贵的和不贵的分组(返回一个
Map<Boolean, List<Transaction>>
)。
我们来看下不是用流,是如何处理的
如果用流呢?
简介
Map<Currency, List<Transaction>> transactionsByCurrencies =transactions.stream().collect(groupingBy(Transaction::getCurrency));
这个例子清晰的展示了函数式编程相对于指令式编程的一个主要优势:只需指出希望的结果—“做什么”,而不用操心执行的步骤——“如何做” 。
这个例子中传递给 collect方法的参数是 Collector 接口的一个实现,也就是给 Stream 中元素做汇总的方法。 我们之前接触的toList 只是说“按顺序给每个元素生成一个列表”; groupingBy 说的是“生成一个Map ,它的键是(货币)桶,值则是桶中那些元素的列表”。
要是做多级分组,指令式和函数式之间的区别就会更加明显:由于需要好多层嵌套循环和条件,指令式代码很快就变得更难阅读、更难维护、更难修改。相比之下,函数式版本只要再加上一个收集器就可以轻松地增强功能了。
收集器用作高级归约
对流调用collect 方法将对流中的元素触发一个归约操作(由 Collector 来参数化)。
看个归约操作的示例: 遍历流中的每个元素,并让 Collector 进行处理
一般来说, Collector 会对元素应用一个转换函数(很多时候是不体现任何效果的恒等转换例如 toList ),并将结果累积在一个数据结构中,从而产生这一过程的最终输出。
例如,
Map<Currency, List<Transaction>> transactionsByCurrencies =transactions.stream().collect(groupingBy(Transaction::getCurrency));
这个交易分组的例子中,转换函数提取了每笔交易的货币,随后使用货币作为键,将交易本身累积在生成的 Map 中。
Collector 接口中方法的实现决定了如何对流执行归约操作。但 Collectors 实用类提供了很多静态工厂方法,可以方便地创建常见收集器的实例,只要拿来用就可以了。最直接和最常用的收集器是 toList静态方法,它会把流中所有的元素收集到一个 List 中:
List<Transaction> transactions = transactionStream.collect(Collectors.toList());
预定义收集器
预定义收集器的功能,也就是那些可以从 Collectors类提供的工厂方法(例如 groupingBy )创建的收集器。
它们主要提供了三大功能:
- 将流元素归约和汇总为一个值
- 元素分组
- 元素分区
后续的博文我们继续对这几类展开学习~
Java 8 - 收集器Collectors相关推荐
- android string.join java8_Java8 - 更优雅的字符串连接(join)收集器 Collectors.joining
Java8 - 更优雅的字符串连接(join)收集器 Collectors.joining Zebe 2018-10-15 38 0 Java,Java8 StringBuilder,Collecto ...
- 深入JVM虚拟机(四) Java GC收集器
转载自 深入JVM虚拟机(四) Java GC收集器 1 GC收集器 1.1 Serial串行收集器 串行收集器主要有两个特点:第一,它仅仅使用单线程进行垃圾回收:第二,它独占式的垃圾回收. 在串行 ...
- JDK8 | 字符串收集器 Collectors.joining()
JDK8的流收集器Collectors.joining 支持灵活的参数配置,可以指定字符串连接时的分隔符,前缀和后缀,可选用.用于拼接字符串,更方便好用. 例: final String[] strs ...
- Java 8 - 收集器Collectors_归约和汇总
文章目录 Pre 查找流中的最大值和最小值 需求:想要找出热量最高的菜和热量最低的菜 汇总 需求: 求出菜单列表的总热量 需求: 一次操作求出菜单中元素的个数,并得总和.平均值.最大值和最小值 (su ...
- Java GC收集器配置说明
根据Java GC收集器具体分类,我们可以看出JVM根据需求不同提供了三种选择:串行收集器.并行收集器.并发收集器. 串行收集器只适用于小数据量的情况,我们主要了解一下并行收集器和并发收集器.默认情况 ...
- Java 8 - 收集器Collectors_分组groupingBy
文章目录 Pre 多级分组 按子组收集数据 查找每个子组中热量最高的 Dish 图解工作过程 与 groupingBy联合使用的其他收集器的例子 附 Pre 来看个小例子: 把菜单中的菜按照类型进行分 ...
- Java8中字符串连接(join)收集器 Collectors.joining
** Java8中的字符串连接收集器 ** 在JDK8中,可以采用函数式编程(使用 Collectors.joining 收集器)的方式对字符串进行更优雅的连接. Collectors.joining ...
- java虚拟机收集器_Java虚拟机(JVM)垃圾回收器G1收集器 - Break易站
G1收集器 G1(Garbage-First)是JDK7-u4才推出商用的收集器: 1.特点 (A).并行与并发 能充分利用多CPU.多核环境下的硬件优势: 可以并行来缩短"Stop The ...
- java默认收集器_jvm默认垃圾收集器
jdk1.7 默认垃圾收集器Parallel Scavenge(新生代)+Parallel Old(老年代) jdk1.8 默认垃圾收集器Parallel Scavenge(新生代)+Parallel ...
最新文章
- CATransition
- Android 中 include的使用
- 人体轮廓_她用硅树脂打造反人体曲线的怪诞廓形Oversize设计,极具爆发性的雕塑感时装!...
- 跨域资源共享的10种方式
- 比尔盖茨:若新冠病毒疫苗有效 富裕国家在2021年底恢复正常
- 让SQL用户快速进入Hadoop大数据时代 —— Transwarp Inceptor是怎样炼成的
- 中国青年报:“宋祖德现象”考验道德与法
- 大数据时代下的SQL Server第三方负载均衡方案 ----Moebius测试
- OSChina 周六乱弹 ——什么是村支书不可推卸的责任!
- 拼多多怎么做?无货源新手怎么轻松上手?(小珏)
- 笔记本上开启小键盘的快捷键
- 香港服务器需要如何来维护呢?
- Hbase(3):HBase常用shell
- clang diagnostic用例
- 红帽Redhat—Linux磁盘管理
- 如何避免用户“漫天要价”和“就地还钱”
- js数组去重排序(升序、降序、随机)方法
- Jmeter获取短信验证码接口压测
- WMP11 官方简体中文版下载
- Adobe国际认证证书对职业应聘有用吗?