// 用来添加需要导出excel表格的数据 final List suggestedLevelVOS = new ArrayList<>();

for (final String empCodeAndNameDeptName : empCodeAndNameDeptNameGroup.keySet()) { // 获取到员工所对应的建议等级数据 final List 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> wightLevelNameGroup = suggestedLevelExportDTOS.stream() .collect(Collectors.groupingBy(SuggestedLevelExportDTO::getWightLevelName));

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

for变成stream流,不能使用.forEach( 内容:因为使用.forEach()方法时,无法在内部修改外部变量suggestedLevelVOS,所以需要使用.collect(Collectors.toList())方法来收集数据并返回一个新的List。

以下是将for循环转换为Stream流的示例代码:

final List<SuggestedLevelVO> suggestedLevelVOS = empCodeAndNameDeptNameGroup.keySet().stream()
.flatMap(empCodeAndNameDeptName -> {
// 获取到员工所对应的建议等级数据
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);

// 权重级别名称为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());

return Stream.concat(Stream.of(otherWightLeveSuggestedLevelVO), suggestedLevelVOs.stream());
})
.collect(Collectors.toList());

return suggestedLevelVOS;

请注意,在使用.flatMap()方法时,我们将otherWightLeveSuggestedLevelVOsuggestedLevelVOs流合并为一个流,并使用.collect(Collectors.toList())方法收集结果。

Java 中将 For 循环转换为 Stream 流的最佳实践

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

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