如何以更优雅的方式实现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
相关产品推荐
相关产品推荐

