模拟数据
@NoArgsConstructor
@AllArgsConstructor
@Data
@Builder
class T {
String s;
String b;
}
List list = new ArrayList<>();
list.add(T.builder().b("1").s("2021-05-01 09:10:10").build());
list.add(T.builder().b("1").s("2021-05-01 09:10:11").build());
list.add(T.builder().b("2").s("2021-05-02 09:10:10").build());
list.add(T.builder().b("3").s("2021-07-05 09:10:10").build());
list.add(T.builder().b("4").s("2021-08-05 09:10:10").build());
list.add(T.builder().b("5").s("2021-07-09 09:10:10").build());
list.add(T.builder().b("6").s("2021-02-01 09:10:10").build());
接下来用stream流处理数据
1、groupingBy(Function super T, ? extends K> classifier) 方法
源码默认生成的是HashMap,乱序的
Map> map1 = list.stream().collect(Collectors.groupingBy(T::getS));
map1.forEach((k, v) -> System.out.println(k + ":" + v));
结果如图:
2、groupingBy(Function super T, ? extends K> classifier, Supplier
可以传入LinkedHashMap或TreeMap等
例如
Map> map2 = list.stream()
.collect(Collectors.groupingBy(s -> s.getS().substring(0, 10),
LinkedHashMap::new,
Collectors.toList()
));
map2.forEach((k, v) -> System.out.println(k + ":" + v));
使用LinkedHashMap构造函数时,可以使用s.getS().substring(0, 10),
结果如图
顺序就是插入list时的顺序,不变。待处理数据已经是需要的顺序时可以使用。
使用TreeMap构造函数时,默认正序展示数据
Map> map3 = list.stream()
.collect(Collectors.groupingBy(s -> s.getS().substring(0, 10),
TreeMap::new,
Collectors.toList()
));
map3.forEach((k, v) -> System.out.println(k + ":" + v));
结果如图
但是如果想要倒序,
Map> map4 = list.stream()
.collect(Collectors.groupingBy(s -> s.getS().substring(0, 10),
() -> new TreeMap<>(Collections.reverseOrder()),
Collectors.toList()
));
map4.forEach((k, v) -> System.out.println(k + ":" + v));
结果如图
这里使用倒序时,一定注意构造方法里的排序不能错写成Comparator.reverseOrder(),一个是接口,一个是类,虽然Comparator.reverseOrder()调用的也是Collections.reverseOrder(),但是会报错
Error:(44, 36) java: 对于groupingBy((s)->s.get[...], 10),()->new Tr[...]er()),java.util.stream.Collector>), 找不到合适的方法
方法 java.util.stream.Collectors.groupingBy(java.util.function.Function super T,? extends K>)不适用
(无法推断类型变量 T,K
(实际参数列表和形式参数列表长度不同))
方法 java.util.stream.Collectors.groupingBy(java.util.function.Function super T,? extends K>,java.util.stream.Collector super T,A,D>)不适用
(无法推断类型变量 T,K,A,D
(实际参数列表和形式参数列表长度不同))
方法 java.util.stream.Collectors.groupingBy(java.util.function.Function super T,? extends K>,java.util.function.Supplier,java.util.stream.Collector super T,A,D>)不适用
(推断类型不符合上限
推断: java.lang.Object
上限: java.lang.Comparable super T>,T,java.lang.Object)