Hay básicamente dos bibliotecas útiles que pueden ayudar con esto; Google Guava y Apache Commons Collections.
Lo que estás tratando de hacer es básicamente dos operaciones, primero mapeo, luego reducción. Nunca he usado Commons Collections en modo alguno, así que no puedo contarle más sobre eso, pero sé que no hay soporte para reducción (o plegado) en Google Guava al menos (consulte Issue 218). Esto no es demasiado difícil añadir a sí mismo, aunque (no probado):
interface Function2<A, B> {
B apply(B b, A a);
}
public class Iterables2 {
public static <A, B> B reduce(Iterable<A> iterable,
B initial, Function2<A, B> fun) {
B b = initial;
for (A item : iterable)
b = fun.apply(b, item);
return b;
}
}
De esta manera se puede combinar con guayabas Iterables.transform(), así:
class Summer implements Function2<Integer, Integer> {
Integer apply(Integer b, Integer a) {
return b + a;
}
}
class MyMapper<T> implements Function<T, Integer> {
Integer apply(T t) {
// Do stuff
}
}
Y luego (se proporciona' ve importación static'ed las clases apropiadas):
reduce(transform(iterable, new MyMapper()), 0, new Summer());
también ver this question.
¿Podría corregir su ejemplo? Me sale 'El método aplicar (A) en el tipo Función no es aplicable para los argumentos (B, A)' en la línea fun.apply(). –
Quizás. Probablemente no.La respuesta es de 5 años, solo usa Java 8 streams :) –