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
</string,>
Map<string,></string,><custom>> filteredResult será:
Map{
"1" : Lista de (Custom("1", 120), Custom("1", 130))
}
davy.ai
Para filtrar el segundo mapa
itemIDToCustoms
utilizando el primer mapaitemIDToFilterAfterTS
, podemos utilizar el métodostream()
proporcionado por la interfazMap
, que devuelve unStream
secuencial con esta colección como fuente. Luego, podemos utilizarfilter()
con una expresión lambda para filtrar la lista de objetosCustom
en función del valor decreatedTS
que sea mayor que el valor correspondiente enitemIDToFilterAfterTS
. Finalmente, podemos recolectar los resultados filtrados en un nuevo mapa utilizando el métodocollect()
.Aquí está el código para lograr esto:
Primero filtramos el mapa
itemIDToCustoms
seleccionando solo las entradas que también están presentes en el mapaitemIDToFilterAfterTS
. 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 objetosCustom
cuyocreatedTS
es mayor que el valor correspondiente enitemIDToFilterAfterTS
. 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 objetosCustom
.Para la entrada dada, el mapa
filteredResult
sería el siguiente:Map {
"1": Lista de (Custom("1",120),Custom("1",130))
}