Tengo una función genérica que acepta Collection<? extends T> ts
.
También estoy pasando:
Function<? extends T, ? extends K> classifier
que mapea cada elemento T
a una tecla K
(posible tener duplicados)
Function<? extends T, Integer> evaluator
lo que da un valor entero para el elemento.
La función en sí tiene un built-in de cálculo (" int to int
") para cada producido Integer
(podría ser algo así como la cuadratura para nuestro ejemplo)
Por último, me gustaría resumir todos los valores para cada tecla.
Por lo que el resultado final es: Map<K, Integer>
.
Por ejemplo,
supongamos que tenemos la lista ["a","a", "bb"]
y se utiliza Function.identity
para clasificar, String::length
evaluar y elevar al cuadrado como el incorporado en la función. A continuación, el mapa devuelto será:{"a": 2, "b": 4}
¿Cómo puedo hacer eso? (Supongo que preferiblemente usando Collectors.groupingBy
)
He aquí una manera de hacerlo:
public static <T,K> Map<K,Integer> mapper (
Collection<T> ts,
Function<T, K> classifier,
Function<T, Integer> evaluator,
Function<Integer,Integer> calculator)
{
return
ts.stream()
.collect(Collectors.groupingBy(classifier,
Collectors.summingInt(t->evaluator.andThen(calculator).apply(t))));
}
La salida para:
System.out.println (mapper(Arrays.asList("a","a","bb"),Function.identity(),String::length,i->i*i));
es
{bb=4, a=2}