ejemplo java iterator java-8 java-stream collectors

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:

  1. Repase las claves del Map y filtrelas utilizando un atributo Term .
  2. 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 )
  3. 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.