Java中如何从List<Bar>生成仅含基类Foo属性的List<Foo>集合
方案1:Java 8+ Stream流式转换(推荐)
你需要先给Foo、Bar类补充基础的构造方法和属性的getter/setter:
// 补充后的Foo类示例 public class Foo { private String a; // 无参构造 public Foo() {} // 带a参数的构造 public Foo(String a) { this.a = a; } // getter、setter public String getA() {return a;} public void setA(String a) {this.a = a;} } // 补充后的Bar类示例 public class Bar extends Foo { private String b; // getter、setter public String getB() {return b;} public void setB(String b) {this.b = b;} }
之后直接用流转换生成全新的Foo实例集合即可:
import java.util.List; import java.util.stream.Collectors; // 转换代码 List<Foo> fooList = bars.stream() .map(bar -> new Foo(bar.getA())) .collect(Collectors.toList()); // Java 16+ 可以直接用.toList()代替collect(Collectors.toList())
方案2:普通for循环转换(适配低版本Java)
如果使用Java 8以下的版本,直接遍历逐个转换即可:
List<Foo> fooList = new ArrayList<>(bars.size()); for (Bar bar : bars) { Foo foo = new Foo(); foo.setA(bar.getA()); fooList.add(foo); }
方案3:工具类属性拷贝(适合字段多的场景)
如果Foo有很多字段,手动写set逻辑太繁琐,可以用属性拷贝工具类批量拷贝同名属性,以Spring的BeanUtils为例:
import org.springframework.beans.BeanUtils; List<Foo> fooList = new ArrayList<>(bars.size()); for (Bar bar : bars) { Foo foo = new Foo(); BeanUtils.copyProperties(bar, foo); fooList.add(foo); }
注意避坑
不要直接把Bar实例向上转型为Foo就放入集合,这种方式只是语法层面做了类型转换,实际存储的对象还是Bar实例,依然持有b字段,不符合你“不包含子类b字段”的要求,必须生成新的纯Foo实例才可以。
内容的提问来源于stack exchange,提问作者user2395365
相关产品推荐
相关产品推荐

