Java8 Stream流 对list转map的操作

模拟数据

@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 classifier) 方法

源码默认生成的是HashMap,乱序的

Map> map1 = list.stream().collect(Collectors.groupingBy(T::getS));
map1.forEach((k, v) -> System.out.println(k + ":" + v));

结果如图:

Java8 Stream流 对list转map的操作_第1张图片

2、groupingBy(Function classifier, Supplier mapFactory, Collector downstream) 方法

可以传入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),

结果如图

Java8 Stream流 对list转map的操作_第2张图片

顺序就是插入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));

结果如图

Java8 Stream流 对list转map的操作_第3张图片

但是如果想要倒序,

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

结果如图

Java8 Stream流 对list转map的操作_第4张图片

这里使用倒序时,一定注意构造方法里的排序不能错写成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)不适用
      (无法推断类型变量 T,K
        (实际参数列表和形式参数列表长度不同))
    方法 java.util.stream.Collectors.groupingBy(java.util.function.Function,java.util.stream.Collector)不适用
      (无法推断类型变量 T,K,A,D
        (实际参数列表和形式参数列表长度不同))
    方法 java.util.stream.Collectors.groupingBy(java.util.function.Function,java.util.function.Supplier,java.util.stream.Collector)不适用
      (推断类型不符合上限
        推断: java.lang.Object
        上限: java.lang.Comparable,T,java.lang.Object)

你可能感兴趣的:(stream,java)