Java Stream 性能对比:分组 vs 循环遍历

本文对比了两种使用 Java Stream 处理推送数据的方法,并分析了两种方法的优劣:

方法一:循环遍历

List<PushVO> pushVOList = new ArrayList<>();
List<String> modules = pushList.stream()
        .map(Push::getModule)
        .distinct()
        .collect(Collectors.toList());
modules.forEach(i -> {
    List<PushDTO> pushDTOList = PushConverter.INSTANCE.toPushDTO(pushList.stream().filter(j -> j.getModule().equals(i)).collect(Collectors.toList()));
    pushVOList.add(
            PushVO.builder()
                    .module(i)
                    .messageList(pushDTOList)
                    .build()
    );
});

方法二:分组

List<PushVO> pushVOList = pushList.stream()
        .collect(Collectors.groupingBy(Push::getModule))
        .entrySet()
        .stream()
        .map(entry -> PushVO.builder()
                .module(entry.getKey())
                .messageList(PushConverter.INSTANCE.toPushDTO(entry.getValue()))
                .build())
        .collect(Collectors.toList());

性能分析

第二种方式的性能更好。原因是第一种方式需要进行两次流操作,一次是获取所有的模块列表,第二次是根据每个模块获取对应的推送列表。而第二种方式只需要一次流操作,利用 Collectors.groupingBy 方法进行分组,然后直接转换为 PushVO 对象。因此,第二种方式在性能上更加高效。

结论

当需要对数据进行分组操作时,使用 Collectors.groupingBy 方法能够提高代码效率。相比循环遍历,分组方法减少了流操作次数,从而提升了代码性能。


原文地址: https://www.cveoy.top/t/topic/mVck 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录