Obtener elementos con cierto tipo genérico en una lista

Actualmente estoy trabajando en un proyecto de tren y tengo la siguiente pregunta:

Guardo todo el material rodante en una lista: para comprender mejor mi jerarquía de clases, aquí hay un resumen simplificado de la herencia:

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

En mi registro, quiero guardar todo el material rodante en una lista private List<RollingStock> rollingStock;. Hasta ahora, he creado una lista para cada tipo de material rodante (motores, entrenadores, conjuntos de trenes). Sin embargo, necesito eliminar cierto material rodante solo con su ID y, por lo tanto, es más fácil guardar todo en una sola lista.

Desde antes, creé un motor como este:

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

Ahora, con solo una lista, lo hago así:

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

Esto funciona perfectamente bien. Para el método returnEngines () no parece encontrar una solución:

Fue tan fácil como esto con una lista para cada tipo de material rodante:

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

Ahora, tengo que filtrar todos los motores de la lista de material rodante:

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

    }

Podría agregar el método public String getType()y verificar su tipo.

No puedo imaginar que no haya una mejor solución.

¿Cómo se puede hacer esto?

Respuesta 1

Transmita la lista, filtre las instancias de Engine; mapear las instancias de RollingStocka Engine(con un reparto), recopilar los resultados en un nuevo List. Me gusta,

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

En el libro 'Estructuras de datos y algoritmos en java' se proporciona el siguiente código de método de búsqueda de Array: {int j; para (j = 0; j <nElems; j ++) // para cada elemento, if (a [j] ....

Tengo un proceso en el que uno de sus hilos de fondo (Thread-A) hace una tarea. Si el proceso se bloquea / cuelga, quiero asegurarme de que el subproceso de fondo también se bloquee (se detiene). Lo que yo ...

Estoy tratando de grabar la voz 5 segundos después de hacer clic en un botón. ¿Hay alguna forma de hacerlo? Por ejemplo, cuando el usuario registra un botón, comienza a grabar 5 segundos y se detiene. Lo que se grabe debería ser ...

Así que tengo un formulario html en "File1.html" <form action = "MyServlet" method = "post"> MyData: <input type = "text" name = "data"> <br> <input type = "submit" valor = "enviar"> </ ...