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

如何以更优雅的方式实现List<A>到List<C>的转换?

优化方案

可以利用Java Stream API的特性,彻底替换掉手动的for循环和集合操作,让代码更简洁、可读性更强:

方案1:合并map与flatMap,直接扁平化处理

原来的代码先把每个A转换成List<C>再通过flatMap扁平化,其实可以直接在flatMap中完成A到多个C的转换,省去中间List的创建:

public static void main(String[] args) {
    A a = new A("test1", "test1", Arrays.asList(new B(1,1), new B(2,2)));
    A a1 = new A("test2", "test2", Arrays.asList(new B(2,2), new B(3,3)));
    List<A> aList = Arrays.asList(a, a1);

    List<C> rList = aList.stream()
            .flatMap(t -> t.getBList().stream()
                    .map(b -> new C(t.getName(), t.getValue(), b.getType(), b.getCount())))
            .collect(Collectors.toList());
}

方案2:抽离转换逻辑,提升代码复用性

如果这个转换逻辑会被多处使用,可以把A+B到C的转换抽成单独的方法,让stream代码更清晰:

方式1:添加工具方法

// 工具方法,负责将A和B转换为C
private static C convertAAndBToC(A a, B b) {
    return new C(a.getName(), a.getValue(), b.getType(), b.getCount());
}

public static void main(String[] args) {
    A a = new A("test1", "test1", Arrays.asList(new B(1,1), new B(2,2)));
    A a1 = new A("test2", "test2", Arrays.asList(new B(2,2), new B(3,3)));
    List<A> aList = Arrays.asList(a, a1);

    List<C> rList = aList.stream()
            .flatMap(a -> a.getBList().stream().map(b -> convertAAndBToC(a, b)))
            .collect(Collectors.toList());
}

方式2:在C类中添加静态工厂方法

把转换逻辑封装到目标类C中,符合单一职责原则:

@AllArgsConstructor
@Data
public class C{
    private String name;
    private String value;
    private Integer type;
    private Integer count;

    // 静态工厂方法,从A和B实例创建C
    public static C from(A a, B b) {
        return new C(a.getName(), a.getValue(), b.getType(), b.getCount());
    }
}

// main方法中的stream调用
List<C> rList = aList.stream()
        .flatMap(a -> a.getBList().stream().map(b -> C.from(a, b)))
        .collect(Collectors.toList());

这些方案都避免了手动创建ArrayList和循环添加元素的冗余代码,利用Stream的声明式风格让代码意图更明确,同时保持了良好的可读性。

内容的提问来源于stack exchange,提问作者bootstrap2025

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 05:45:34