簡體   English   中英

獲取列表中具有特定泛型類型的元素

[英]Get elements with a certain generic type in a list

我目前正在做一個火車項目,我有以下問題:

我將所有機車車輛保存在一個列表中:為了更好地理解我的類層次結構,這里是一個簡化的繼承概述:

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()並檢查它的類型。

我無法想象沒有更好的解決方案。

如何才能做到這一點?

流式傳輸列表,過濾Engine實例; 將實例從RollingStock映射到Engine (使用演員表),將結果收集到一個新的List 喜歡,

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

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);
}
...

或者可以直接調用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM