In realtà è stato originariamente progettato in modo simile a quello che proponete. Vedere the early implementation nel repository lambda del progetto (makeResult
è ora supplier
). È stato successivamente updated al design attuale. Credo che la logica di tale aggiornamento sia semplificare i combinatori di collettori. Non ho trovato alcuna discussione specifica su questo argomento, ma la mia ipotesi è supportata dal fatto che il collezionista mapping
è apparso nello stesso changeset. Prendere in considerazione l'attuazione di 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());
}
Questa implementazione deve ridefinire solo accumulator
funzione, lasciando supplier
, combiner
e finisher
come è, in modo da non avere ulteriore riferimento indiretto al momento della chiamata supplier
, combiner
o finisher
: basta chiamare direttamente le funzioni restituite dal raccoglitore originale. E 'ancora più importante con 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);
}
Qui è cambiato solo finisher
, ma originale supplier
, accumulator
e combiner
vengono utilizzati. Come viene chiamato accumulator
per ogni elemento, la riduzione dell'indirizzamento potrebbe essere piuttosto importante. Prova a riscrivere mapping
e collectingAndThen
con il tuo progetto proposto e vedrai il problema. Anche i nuovi collettori JDK-9 come filtering
e flatMapping
beneficiano del design attuale.
è tutto basato su OOP e struttura coerente, semplicemente a indovinare. – PSo
Si noti che è possibile implementare una classe base astratta che si adatta al secondo modello. – Thilo
@Thilo Penso che sia il primo che il secondo modello possono essere adattati in ogni direzione. Penso solo che il secondo è più intuitivo. – popcorny