java—在列表中获取具有特定泛型类型的元素

px9o7tmv  于 2021-07-12  发布在  Java
关注(0)|答案(2)|浏览(394)

我目前在一个火车项目上工作,我有以下问题:
我将所有rolling stock保存在一个列表中:为了更好地理解我的类层次结构,下面是一个简化的继承概述:

RollingStock
    Engine
        SteamEngine
        DieselEngine
        ...
    Coach
        FreightCoach
        PassengerCoach
        ...
    TrainSet

在我的登记簿里,我想把所有的机车车辆都保存在一个列表里 private List<RollingStock> rollingStock; . 到目前为止,我已经为每种机车车辆类型(发动机、客车、列车组)创建了一个列表。然而,我需要删除一个特定的机车车辆,只有它的id,因此它更容易保存在一个列表中的一切。
在之前,我创建了这样一个引擎:

public void createEngine(Engine engine) {
        this.engines.add(engine);
    }

现在,只要一张单子,我就可以这样做:

public void createEngine(Engine engine) {
        this.rollingStocks.add(engine);
    }

这个很好用。对于returnengines()方法,我似乎没有找到解决方案:
就这么简单,每种机车车辆类型都有一个列表:

public List<Engine> returnEngines() {
        return engines;
    }

现在,我必须过滤机车车辆列表中的所有发动机:

public List<Engine> returnEngines() {
        ...
        return rollingStock.???;

    }

我可以添加方法 public String getType() 并检查其类型。
我无法想象没有更好的解决办法。
如何做到这一点?

hvvq6cgz

hvvq6cgz1#

流式处理列表,筛选 Engine ; 从Map示例 RollingStockEngine (使用cast),将结果收集到一个新的 List . 比如,

public List<Engine> returnEngines() {
    return rollingStocks.stream().filter(x -> x instanceof Engine)
            .map(x -> (Engine) x).collect(Collectors.toList());
}
nue99wik

nue99wik2#

elliott frisch的回答非常有效,这里有一个通用的解决方案,以防您还需要一个方法来过滤您的寄存器中的任何类型的层次结构:

public <T> List<T> returnClazz(Class<T> clazz) {
    return rollingStocks.stream()
            .filter(clazz::isInstance)
            .map(clazz::cast)
            .collect(Collectors.toList());
}

然后可以由几个助手方法使用,例如。

public List<TrainSet> returnTrainset() {
    return returnClazz(TrainSet.class);
}

public List<Engines> returnEngines() {
    return returnClazz(Engine.class);
}
...

或者可以直接调用。

相关问题