在 Java 代码中,经常会使用 for 循环来遍历集合。但是,使用 Stream 流可以更简洁高效地处理集合数据。然而,如果需要保证循环顺序,则不能使用 .forEach() 方法,而应该使用 .forEachOrdered() 方法。

以下是一个使用 for 循环遍历集合的示例代码:

for (final String empCodeAndNameDeptName : empCodeAndNameDeptNameGroup.keySet()) {
    // 获取到员工所对应的建议等级数据
    final List<SuggestedLevelExportDTO> suggestedLevelExportDTOS = empCodeAndNameDeptNameGroup.get(empCodeAndNameDeptName);

    // empCodeAndName格式为 :'员工编号-员工名称-部门名称'
    final String[] empCodeAndDeptNameNames = StringUtils.split(empCodeAndNameDeptName, Constants.SPLIT_FLAG);

    // 获取不同建议等级所对应的评价总人数
    final Map<String, Long> suggestedLevelGroup = suggestedLevelExportDTOS.stream()
        .collect(Collectors.groupingBy(SuggestedLevelExportDTO::getSuggestedLevel, Collectors.counting()));

    // 获取所有建议等级评价总人数
    final Long otherWightLeveSuggestedLevelSum = MapUtils.emptyIfNull(suggestedLevelGroup).values().stream()
        .mapToLong(Long::longValue)
        .sum();

    final SuggestedLevelVO otherWightLeveSuggestedLevelVO = createSuggestedLevelVO(empCodeAndDeptNameNames, suggestedLevelGroup, otherWightLeveSuggestedLevelSum, StringUtils.EMPTY);
    suggestedLevelVOS.add(otherWightLeveSuggestedLevelVO);

    // 权重级别名称为key,所对应的建议等级数据为value的map
    final Map<String, List<SuggestedLevelExportDTO>> wightLevelNameGroup = suggestedLevelExportDTOS.stream()
        .collect(Collectors.groupingBy(SuggestedLevelExportDTO::getWightLevelName));

    final List<SuggestedLevelVO> suggestedLevelVOs = MapUtils.emptyIfNull(wightLevelNameGroup).keySet().stream()
        .map(wightLevelName -> getSuggestedLevelVO(empCodeAndDeptNameNames, wightLevelNameGroup, wightLevelName))
        .collect(Collectors.toList());
    suggestedLevelVOS.addAll(suggestedLevelVOs);
}

可以使用 Stream 流来替换 for 循环,并使用 .forEachOrdered() 方法来保证循环顺序。修改后的代码如下:

empCodeAndNameDeptNameGroup.keySet().stream().forEachOrdered(empCodeAndNameDeptName -> {
    // 获取到员工所对应的建议等级数据
    List<SuggestedLevelExportDTO> suggestedLevelExportDTOS = empCodeAndNameDeptNameGroup.get(empCodeAndNameDeptName);

    // empCodeAndName格式为 :'员工编号-员工名称-部门名称'
    String[] empCodeAndDeptNameNames = StringUtils.split(empCodeAndNameDeptName, Constants.SPLIT_FLAG);

    // 获取不同建议等级所对应的评价总人数
    Map<String, Long> suggestedLevelGroup = suggestedLevelExportDTOS.stream()
            .collect(Collectors.groupingBy(SuggestedLevelExportDTO::getSuggestedLevel, Collectors.counting()));

    // 获取所有建议等级评价总人数
    Long otherWightLeveSuggestedLevelSum = MapUtils.emptyIfNull(suggestedLevelGroup).values().stream()
            .mapToLong(Long::longValue)
            .sum();

    SuggestedLevelVO otherWightLeveSuggestedLevelVO = createSuggestedLevelVO(empCodeAndDeptNameNames, suggestedLevelGroup, otherWightLeveSuggestedLevelSum, StringUtils.EMPTY);
    suggestedLevelVOS.add(otherWightLeveSuggestedLevelVO);

    // 权重级别名称为key,所对应的建议等级数据为value的map
    Map<String, List<SuggestedLevelExportDTO>> wightLevelNameGroup = suggestedLevelExportDTOS.stream()
            .collect(Collectors.groupingBy(SuggestedLevelExportDTO::getWightLevelName));

    List<SuggestedLevelVO> suggestedLevelVOs = MapUtils.emptyIfNull(wightLevelNameGroup).keySet().stream()
            .map(wightLevelName -> getSuggestedLevelVO(empCodeAndDeptNameNames, wightLevelNameGroup, wightLevelName))
            .collect(Collectors.toList());
    suggestedLevelVOS.addAll(suggestedLevelVOs);
});

使用 Stream 流可以使代码更简洁,并且提高代码可读性。 .forEachOrdered() 方法可以保证循环顺序,确保代码逻辑的正确性。

注意: 在使用 Stream 流时,应该注意其可读性和可维护性。对于复杂的逻辑,可能需要使用传统的 for 循环来保证代码的可理解性。

Java 代码优化:使用 Stream 流替换 for 循环并保证顺序

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

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