如何将多层for-each循环转为Java Stream实现SensorDTO列表构建?
将多层for-each循环转换为Java Stream实现
完整Stream实现代码
import java.util.Set; import java.util.List; import java.util.stream.Collectors; // 核心转换逻辑 List<SensorDTO> sensorDTOS = sensors.stream() .map(sensor -> { // 转换Command集合为CommandDTO集合 Set<CommandDTO> commandSet = sensor.getCommands().stream() .map(command -> { Set<MemberDTO> memberSet = command.getMembers().stream() .map(member -> new MemberDTO(member.getName())) .collect(Collectors.toSet()); return new CommandDTO(command.getName(), memberSet); }) .collect(Collectors.toSet()); // 转换Attribute集合为AttributeDTO集合 Set<AttributeDTO> attributeSet = sensor.getAttributes().stream() .map(attribute -> { Set<FieldDTO> fieldSet = attribute.getFields().stream() .map(field -> new FieldDTO(field.getName())) .collect(Collectors.toSet()); return new AttributeDTO(attribute.getName(), fieldSet); }) .collect(Collectors.toSet()); return new SensorDTO(attributeSet, commandSet); }) .collect(Collectors.toList());
逻辑拆解
对应原来的5层循环,Stream的转换逻辑完全匹配:
- 最外层循环(Loop1):用
sensors.stream().map(...)遍历每个Sensor对象,最终通过collect(Collectors.toList())收集成SensorDTO列表,替代原来的sensorDTOS.add()操作。 - Command循环(Loop2+Loop3):
sensor.getCommands().stream().map()遍历每个Command(对应Loop2)- 内部用
command.getMembers().stream().map(m -> new MemberDTO(m.getName())).collect(Collectors.toSet())将Member集合转换为MemberDTO集合(对应Loop3和memberSet的构建) - 最后收集成
Set<CommandDTO>(对应原来的commandSet)
- Attribute循环(Loop4+Loop5):
- 逻辑和Command部分完全一致,通过嵌套的
stream().map()和collect()完成Attribute到AttributeDTO、Field到FieldDTO的转换。
- 逻辑和Command部分完全一致,通过嵌套的
代码优化:抽离转换方法
如果需要提高代码复用性和可读性,可以把内部的转换逻辑抽成单独的静态方法:
// 转换Member集合为MemberDTO集合 private static Set<MemberDTO> convertToMemberDTOs(Set<Member> members) { return members.stream() .map(member -> new MemberDTO(member.getName())) .collect(Collectors.toSet()); } // 转换单个Command为CommandDTO private static CommandDTO convertToCommandDTO(Command command) { return new CommandDTO(command.getName(), convertToMemberDTOs(command.getMembers())); } // 转换Field集合为FieldDTO集合 private static Set<FieldDTO> convertToFieldDTOs(Set<Field> fields) { return fields.stream() .map(field -> new FieldDTO(field.getName())) .collect(Collectors.toSet()); } // 转换单个Attribute为AttributeDTO private static AttributeDTO convertToAttributeDTO(Attribute attribute) { return new AttributeDTO(attribute.getName(), convertToFieldDTOs(attribute.getFields())); } // 简化后的主转换逻辑 List<SensorDTO> sensorDTOS = sensors.stream() .map(sensor -> new SensorDTO( sensor.getAttributes().stream().map(YourClassName::convertToAttributeDTO).collect(Collectors.toSet()), sensor.getCommands().stream().map(YourClassName::convertToCommandDTO).collect(Collectors.toSet()) )) .collect(Collectors.toList());
注意替换YourClassName为实际包含这些静态方法的类名。
内容的提问来源于stack exchange,提问作者vag
相关产品推荐
相关产品推荐

