En réalité, il était à l'origine conçu de façon similaire à ce que vous proposez. Voir le début de la mise en œuvre du projet lambda référentiel (makeResult
est désormais supplier
). Il plus tard a été mis à jour à la conception actuelle. Je crois, la raison de cette mise à jour est de simplifier collecteur combinators. Je n'ai trouvé aucune discussion spécifique sur ce sujet, mais ma conjecture est confirmée par le fait qu' mapping
collector paru dans le même ensemble de modifications. Envisager la mise en œuvre de l' 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());
}
Cette mise en œuvre doit redéfinir accumulator
fonctionner que, de quitter supplier
, combiner
et finisher
comme l'est, de sorte que vous n'avez pas d'indirection supplémentaire lors de l'appel d' supplier
, combiner
ou finisher
: vous suffit d'appeler directement les fonctions retourné par le collecteur d'origine. Il est encore plus important avec 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);
}
Ici, seulement finisher
est changé, mais originale supplier
, accumulator
et combiner
sont utilisés. En tant que accumulator
est appelée pour chaque élément, la réduction de l'indirection pourrait être assez important. Essayer de réécrire mapping
et collectingAndThen
avec votre proposition de conception et vous verrez le problème. Nouveau JDK-9 collectionneurs comme filtering
et flatMapping
également profiter de l'actuelle conception.