es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Filtrar Map> utilizando Java Streams

class Custom{
    String itemId;
    long createdTS;

    //constructor
    public Custom(String itemId, long createdTS){
        this.itemId = itemId;
        this.createdTS = createdTS;
    }
}

Tengo dos mapas que son:

Map<string, long=""> itemIDToFilterAfterTS;
Map<string,></string,><custom>> itemIDToCustoms;

Deseo filtrar los valores del segundo mapa, itemIDToCustoms, utilizando los valores del primer mapa, itemIDToFilterAfterTS, para el ítem usando java streams.

Por ejemplo:

itemIDToFilterAfterTS = new HashMap();
itemIDToFilterAfterTS.put("1", 100);
itemIDToFilterAfterTS.put("2", 200);
itemIDToFilterAfterTS.put("3", 300);

itemIDToCustoms = new HashMap();
List<custom> listToFilter = new ArrayList();
listToFilter.add(new Custom("1", 50));
listToFilter.add(new Custom("1", 90));
listToFilter.add(new Custom("1", 120));
listToFilter.add(new Custom("1", 130));
itemIDToCustoms.put("1", listToFilter);

Ahora quiero utilizar java streams y obtener el mapa filtrado resultado para el cual getKey("1") devuelve una lista filtrada de objetos Custom que tienen createdTS > 100 (100 se obtendrá de itemIDToFilterAfterTS.getKey("1")).

java
Map<string,></string,><custom>> filteredResult será:
Map{
"1" : Lista de (Custom("1", 120), Custom("1", 130))
}
</string,>

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para filtrar el segundo mapa itemIDToCustoms utilizando el primer mapa itemIDToFilterAfterTS, podemos utilizar el método stream() proporcionado por la interfaz Map, que devuelve un Stream secuencial con esta colección como fuente. Luego, podemos utilizar filter() con una expresión lambda para filtrar la lista de objetos Custom en función del valor de createdTS que sea mayor que el valor correspondiente en itemIDToFilterAfterTS. Finalmente, podemos recolectar los resultados filtrados en un nuevo mapa utilizando el método collect().

    Aquí está el código para lograr esto:

    Map<string,></string,><custom>> filteredResult = itemIDToCustoms.entrySet().stream()
            .filter(entry -> itemIDToFilterAfterTS.containsKey(entry.getKey()))
            .collect(Collectors.toMap(Map.Entry::getKey,
                    entry -> entry.getValue().stream()
                            .filter(custom -> custom.createdTS > itemIDToFilterAfterTS.get(entry.getKey()))
                            .collect(Collectors.toList())));
    

    Primero filtramos el mapa itemIDToCustoms seleccionando solo las entradas que también están presentes en el mapa itemIDToFilterAfterTS. Luego, para cada una de estas entradas, obtenemos el valor de la lista y lo convertimos en un stream. Filtramos el stream para obtener solo los objetos Custom cuyo createdTS es mayor que el valor correspondiente en itemIDToFilterAfterTS. Finalmente, recolectamos el stream filtrado en una lista y devolvemos un nuevo mapa donde la clave es la misma que la clave en la entrada filtrada y el valor es la lista filtrada de objetos Custom.

    Para la entrada dada, el mapa filteredResult sería el siguiente:

    Map {
    "1": Lista de (Custom("1",120),Custom("1",130))
    }

Comments are closed.