W rzeczywistości został pierwotnie zaprojektowany podobnie do tego, co proponujesz. Zobacz the early implementation w repozytorium lambda projektu (makeResult
jest teraz supplier
). To było później updated do obecnego projektu. Uważam, że uzasadnieniem takiej aktualizacji jest uproszczenie systemów gromadzenia kolektorów. Nie znalazłem żadnej konkretnej dyskusji na ten temat, ale moje przypuszczenie jest poparte faktem, że kolekcjoner mapping
pojawił się w tym samym zestawie zmian. Rozważmy realizację Collectors.mapping
:
public static <T, U, A, R>
Collector<T, ?, R> mapping(Function<? super T, ? extends U> mapper,
Collector<? super U, A, R> downstream) {
BiConsumer<A, ? super U> downstreamAccumulator = downstream.accumulator();
return new CollectorImpl<>(downstream.supplier(),
(r, t) -> downstreamAccumulator.accept(r, mapper.apply(t)),
downstream.combiner(), downstream.finisher(),
downstream.characteristics());
}
Ta implementacja musi przedefiniować tylko accumulator
funkcji, pozostawiając supplier
, combiner
i finisher
jak jest, więc nie ma dodatkowych zadnie Dzwoniąc supplier
, combiner
lub finisher
: wystarczy zadzwonić bezpośrednio funkcje zwrócone przez oryginalny kolektor. To nawet ważniejsze z collectingAndThen
:
public static<T,A,R,RR> Collector<T,A,RR> collectingAndThen(Collector<T,A,R> downstream,
Function<R,RR> finisher) {
// ... some characteristics transformations ...
return new CollectorImpl<>(downstream.supplier(),
downstream.accumulator(),
downstream.combiner(),
downstream.finisher().andThen(finisher),
characteristics);
}
Tutaj tylko finisher
zostanie zmieniony, ale oryginalny supplier
, accumulator
i combiner
są używane. Ponieważ dla każdego elementu wywoływane jest accumulator
, zmniejszenie indoktrysu może być dość ważne. Spróbuj przepisać mapping
i collectingAndThen
z proponowanym projektem, a zobaczysz problem. Nowe kolektory JDK-9, takie jak filtering
i flatMapping
, również korzystają z obecnego projektu.
to wszystko na temat OOP i struktury spójne, po prostu zgadywanie. – PSo
Należy pamiętać, że można zaimplementować abstrakcyjną klasę bazową, która dostosowuje się do drugiego wzorca. – Thilo
@Thilo Myślę, że zarówno pierwszy, jak i drugi wzór można dostosować w każdym kierunku. Po prostu uważam, że drugi jest bardziej intuicyjny. – popcorny