前言
第一讲在这里:关于collect(),Collector的解析【理解Collector非常重要,否则无法学习收集部分】
- 本次我们分析 groupingBy 分组,及嵌套分组
- 下一讲分析 partitioningBy分区
一、groupingBy使用
groupingBy是用来分组的,它是Collectors的静态方法,类似于SQL中的group by,一般如下:
1 | java复制代码 |
可以发现,它一般生成Map K就是分组的条件, V一般都用List接受,当然可以对List继续分组,实现多层Map。
二、方法参数解析
还是强调:先熟悉Collector的构造才可以理解。
1 | java复制代码public static <T, K, D, A, M extends Map<K, D>> |
groupingBy方法需要传入三个参数:
- 1、classifier,提供 T,返回 K, 这个的做主要作用是:流中元素是T,我们需要根据它得到的K 进行分组。
- 2、mapFactory,它最终的形态是 M extends Map<K, D> ,比如示例中的Map<Integer, List>
是最终返回的容器, 这个mapFactory 是要替换 Collector中的Supplier<A>
- 3、downstream,它是Collector的实现类,T是流中元素,和classifier中的T 对应,A 就是supplier提供的容器, D是finisher 返回的结果容器。
三、代码详解
1 | java复制代码public static <T, K, D, A, M extends Map<K, D>> |
四:总结
1、需要体会 groupingBy的嵌套分组。
2、通过代码可以看出,如果并发收集Map,需要进行combiner,效率可能并没有串行流高,甚至当A和D不相同时,会进行一个replaceAll,效率更低,所以希望使用时,根据需要进行并行or串行, A 和 D的类型尽量可以统一,是否使用IDENTITY_FINISH 要心中有数。
本文转载自: 掘金