Dans cet article, nous allons examiner un nouveau collecteur introduit dans Java 12. Cette nouvelle fonctionnalité n'a pas été annoncée dans le JEP officiel, car il s'agissait d'une demande de modification mineure avec le titre "
Créer un collecteur, qui fusionne les résultats de deux autres collecteurs ". Il est conçu pour combiner les résultats de deux collecteurs.
Tout intéressant - sous la coupe
Si vous ne savez toujours pas ce que sont les collectionneursLes collecteurs sont des classes spéciales utilisées pour convertir un flux en une autre structure de données. Par exemple, dans la
list
:
list = Stream.of(1,2,3).collect(Collectors.toList());
Ceci est un exemple inutile, car il crée un nouveau flux et le transforme immédiatement. Il est pensé pour montrer l'utilisation des collectionneurs
La documentation
Cliquez ici pour voir le
Collectors#teeing
. Selon la documentation officielle:
«... renvoie un collectionneur composé de deux collectionneurs subordonnés. Chaque élément transféré au collecteur résultant est traité par les deux collecteurs subordonnés, puis leurs résultats sont combinés à l'aide d'une fonction spéciale qui les relie au résultat final. »
L'original"... renvoie un collecteur composé de deux collecteurs en aval. Chaque élément transmis au collecteur résultant est traité par les deux collecteurs en aval, puis leurs résultats sont fusionnés à l'aide de la fonction de fusion spécifiée dans le résultat final."
En-tête de méthode:
static <T, R1, R2, R> Collector<T, ?, R> teeing( Collector<? super T, ?, R1> downstream1, Collector<? super T, ?, R2> downstream2, BiFunction<? super R1, ? super R2, R> merger)
Fait intéressant
Ceci est un
tee (
tee de l'anglais):

Teeing
tee est venu d'un tee. Selon Wikipédia, "un té est le raccord le plus courant (reliant une partie d'un pipeline, environ Translator) utilisé pour combiner [ou diviser] un flux de fluide (dans ce cas, nous entendons les flux, flux - flux / flux, traducteur de commentaires)."
D'autres noms ont été proposés: bissection (division en 2 parties), duplexage, bifurcation (division), réplicateur, fanout (division), tapotement, décompression, collectionToBothAndThen, biCollecting, expansion (extension), bifurcation, etc.
Toutes les alternatives notées par les développeurs Core peuvent être trouvées ici .
Exemples d'utilisation
J'ai compilé trois exemples d'utilisation de code avec différents niveaux de complexité.
Liste d'invités
Nous extrayons deux types d'informations différents de la liste des objets du flux. Chaque invité doit accepter l'invitation et peut diriger la famille. Nous voulons savoir
qui a confirmé la réservation et le
nombre total de participants (y compris les invités et les membres de la famille).
var result = Stream.of(
Invité class Guest { private String name; private boolean participating; private Integer participantsNumber; public Guest(String name, boolean participating, Integer participantsNumber) { this.name = name; this.participating = participating; this.participantsNumber = participantsNumber; } public boolean isParticipating() { return participating; } public Integer getParticipantsNumber() { return participantsNumber; } }
Participation à l'événement class EventParticipation { private List<String> guestNameList; private Integer totalNumberOfParticipants; public EventParticipation(List<String> guestNameList, Integer totalNumberOfParticipants) { this.guestNameList = guestNameList; this.totalNumberOfParticipants = totalNumberOfParticipants; } @Override public String toString() { return "EventParticipation { " + "guests = " + guestNameList + ", total number of participants = " + totalNumberOfParticipants + " }"; }}
Filtrer les noms dans deux listes différentes
Dans cet exemple, nous divisons le flux de noms en deux listes en fonction du filtre.
var result = Stream.of("Devoxx", "Voxxed Days", "Code One", "Basel One", "Angular Connect") .collect(Collectors.teeing(
Comptez et ajoutez un flux de nombres
Vous avez peut-être vu un exemple similaire apparaître sur des blogs qui combinent somme et nombre pour obtenir la moyenne. Cet exemple ne nécessite pas de départ, et vous pouvez simplement utiliser
AverageInt
et un simple collecteur.
L'exemple suivant utilise des fonctions de
Teeing
pour renvoyer deux valeurs:
var result = Stream.of(5, 12, 19, 21) .collect(Collectors.teeing(
Résultat class Result { private Long count; private Integer sum; public Result(Long count, Integer sum) { this.count = count; this.sum = sum; } @Override public String toString() { return "{" + "count=" + count + ", sum=" + sum + '}'; }}
Piège possible
Map.Entry
De nombreux exemples utilisent
Map.Entry
pour stocker le résultat d'une
BiFunction
. Veuillez ne pas le faire car vous ne pouvez pas stocker le dernier argument dans la
Map
. Il n'y a pas d'objet standard dans Java Core pour stocker deux valeurs - vous devrez le créer vous-même.
Tout sur les nouvelles fonctionnalités de Java 12
Vous pouvez trouver plus d'informations et des faits intéressants sur Java 12 dans cette
présentation .
Objets de collection réussis!