Stream中的GroupingBy

​ 今天在工作中写了类似下面这段代码,代码被同事看到说存在问题,今天来学习一下Stream中的groupingBy。

Map<Integer, List<String>> integerListMap = list.stream().collect(Collectors.groupingBy(String::length));

​ 这段代码本身从语法和功能上来看是正确的,它将list中的字符串元素按照长度进行分组,并将结果存储在integerListMap这个Map<Integer, List>类型的变量中。其中,键(Integer)表示字符串的长度,值(List)则是具有相同长度的所有字符串组成的列表。但是确实存在问题.

  1. 检查list是否为空或为null

    ​ 在执行流操作之前,尽量先检查list是否为null或是否为空,以避免不必要的计算或抛出NullPointerException。

    if (list != null && !list.isEmpty()) {
        Map<Integer, List<String>> integerListMap = list.stream().collect(Collectors.groupingBy(String::length));
    }
  2. 应该使用parallelStream()并行流提高性能

    ​ 如果list非常大,可以使用并行流来提高处理速度。但是要注意,对于大型数据集,这可能需要更多的CPU核心才能看到性能提升。同时,如果integerListMap会被多个线程访问,应该使用线程安全的集合。

    Map<Integer, List<String>> integerListMap = list.parallelStream()
                                                    .collect(Collectors.groupingByConcurrent(String::length));
  3. 如果需要顺序输出需要使用LinkedHashMap保持插入顺序

    Map<Integer, List<String>> integerListMap = list.stream()
                                                    .collect(Collectors.groupingBy(String::length,
                                                                                    LinkedHashMap::new,
                                                                                    Collectors.toList()));
  4. 避免不必要的分组

    ​ 如果list中的字符串长度分布非常不均,可能会导致某些长度的字符串非常多,而其他长度则几乎没有。在这种情况下,考虑是否真的需要对所有长度都进行分组,或者是否有更高效的数据结构或算法可以使用。

代码已改正√


Stream中的GroupingBy
http://example.com/2024/07/21/Stream中的GroupingBy/
作者
Zhangqs
发布于
2024年7月21日
许可协议