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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 15:06:04