You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将多层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的转换逻辑完全匹配:

  1. 最外层循环(Loop1):用sensors.stream().map(...)遍历每个Sensor对象,最终通过collect(Collectors.toList())收集成SensorDTO列表,替代原来的sensorDTOS.add()操作。
  2. 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)
  3. Attribute循环(Loop4+Loop5):
    • 逻辑和Command部分完全一致,通过嵌套的stream().map()和collect()完成Attribute到AttributeDTO、Field到FieldDTO的转换。

代码优化:抽离转换方法

如果需要提高代码复用性和可读性,可以把内部的转换逻辑抽成单独的静态方法:

// 转换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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 13:35:27