Istnieją dwa przydatnych bibliotek, które mogą w tym pomóc; Google Guava i Apache Commons Collections.
Co próbujesz zrobić, to zasadniczo dwie operacje, pierwsze mapowanie, a następnie redukcja. Nigdy nie używałem Commons Commons w żadnym stopniu, więc nie mogę ci więcej o tym powiedzieć, ale wiem, że nie ma żadnego wsparcia dla redukcji (lub składania) przynajmniej w Google Guava (zobacz Issue 218). To nie jest zbyt trudne, aby dodać siebie choć (nie testowane):
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;
}
}
W ten sposób można połączyć je z guawy Iterables.transform() tak:
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
}
}
A potem (o ile” ve import static'ed odpowiednich klas):
reduce(transform(iterable, new MyMapper()), 0, new Summer());
Zobacz także this question.
Czy możesz poprawić swój przykład? Otrzymuję 'Metoda stosuje się (A) w typie Funkcja nie ma zastosowania dla argumentów (B, A)' na linii fun.apply(). –
Może. Prawdopodobnie nie.Odpowiedź brzmi 5 lat, po prostu korzystaj ze strumieni Java 8 :) –