ejemplo - Java 8-Lista de filtros dentro del valor del mapa
list map java (3)
Estoy escribiendo un método que toma un Map
de entrada del formulario Map<Term, List<Integer>>
donde se define un Term
aquí .
Método:
- Repase las claves del
Map
y filtrelas utilizando un atributoTerm
. - Para cada una de las claves restantes, obtenga el tamaño de la lista correspondiente,
min(List.size(), 5)
a 5 (min(List.size(), 5)
) y agregue el resultado a una var global (por ejemplo,totalSum
) - Return
totalSum
Esto es lo que he escrito hasta ahora:
inputMap
.entrySet()
.stream()
.filter(entry -> entry.getKey().field().equals(fieldName)) // Keep only terms with fieldName
.forEach(entry -> entry.getValue()
.map(size -> Math.min(entry.getValue().size(), 5))) // These 2 lines do not work
.sum();
No puedo tomar como entrada una secuencia de listas, generar un número entero para cada una de esas listas y devolver la suma de todas las salidas.
Obviamente, puedo escribirlo usando bucles for, pero estoy tratando de aprender Java 8 y tenía curiosidad si este problema se puede resolver al usarlo.
La invocación forEach finaliza la transmisión. Puede usar el mapa directamente sin forEach.
No necesita el método forEach
. Puede map
cada entrada del Map
a un int
, y sum
esos enteros:
int sum = inputMap
.entrySet()
.stream()
.filter(entry -> entry.getKey().field().equals(fieldName))
.mapToInt(entry -> Math.min(entry.getValue().size(), 5))
.sum();
Con Eclipse Collections , lo siguiente funcionará usando MutableMap e IntList .
MutableMap<Term, IntList> inputMap =
Maps.mutable.of(term1, IntLists.mutable.of(1, 2, 3),
term2, IntLists.mutable.of(4, 5, 6, 7));
long sum = inputMap
.select((term, intList) -> term.field().equals(fieldName))
.sumOfInt(intList -> Math.min(intList.size(), 5));
Nota: soy un committer para las colecciones de Eclipse.