Есть в основном две полезные библиотеки, которые могут помочь с этим; Google Guava и Apache Commons Collections.
Что вы пытаетесь сделать, это в основном две операции, первое отображение, затем сокращение. Я никогда не использовал Commons Collections в какой-либо степени, поэтому я не могу больше рассказать об этом, но я знаю, что в Google Guava нет поддержки для сокращения (или сворачивания) (см. Issue 218). Это не слишком сложно, чтобы добавить себя, хотя (не проверено):
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;
}
}
Таким образом, вы можете комбинировать его с гуавы Iterables.transform() следующим образом:
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
}
}
И тогда (при условии, вы» ве импорта static'ed соответствующие классы):
reduce(transform(iterable, new MyMapper()), 0, new Summer());
Также см this question.
Не могли бы вы исправить свой пример? Я получаю 'Метод apply (A) в типе Функция не применима для аргументов (B, A)' в строке fun.apply(). –
Может быть. Возможно нет.Ответ 5 лет, просто используйте Java 8 потоков :) –