Eigentlich war es ursprünglich ähnlich wie Sie vorgeschlagen. Siehe the early implementation im Projekt Lambda-Repository (makeResult
ist jetzt supplier
). Es war später updated zum aktuellen Design. Ich glaube, das Grundprinzip einer solchen Aktualisierung besteht darin, Sammlerkombinatoren zu vereinfachen. Ich habe keine spezifische Diskussion zu diesem Thema gefunden, aber meine Vermutung wird durch die Tatsache unterstützt, dass Collector im selben Changeset erschien. Betrachten wir die Implementierung von 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());
}
Diese Implementierung nur accumulator
Funktion neu zu definieren muss, so dass supplier
, combiner
und finisher
wie es ist, so dass Sie keine zusätzlichen Indirektion haben, wenn supplier
Aufruf combiner
oder finisher
: Sie rufen Sie einfach an direkt die Funktionen, die vom ursprünglichen Kollektor zurückgegeben wurden. Es ist noch wichtiger, mit 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);
}
hier nur finisher
geändert wird, aber original supplier
, accumulator
und combiner
verwendet werden. Da accumulator
für jedes Element aufgerufen wird, kann die Reduzierung der Indirektion sehr wichtig sein. Versuchen Sie, mapping
und collectingAndThen
mit Ihrem vorgeschlagenen Entwurf neu zu schreiben, und Sie werden das Problem sehen. Neue JDK-9-Kollektoren wie filtering
und flatMapping
profitieren ebenfalls vom aktuellen Design.
dreht sich alles um OOP und Struktur konsistent, einfach nur raten. – PSo
Beachten Sie, dass Sie eine abstrakte Basisklasse implementieren können, die sich an das zweite Muster anpasst. – Thilo
@Thilo Ich denke, dass sowohl das erste als auch das zweite Muster in jeder Richtung angepasst werden kann. Ich denke nur, dass der zweite intuitiver ist. – popcorny