Java - Teeing Collectors
Bonjour à tous, futurs magiciens Java ! ? Aujourd'hui, nous allons embarquer pour un voyage passionnant dans le monde des Teeing Collectors de Java. Ne vous inquiétez pas si vous êtes nouveau en programmation – je serai votre guide ami, et nous allons avancer pas à pas. À la fin de ce tutoriel, vous serez étonné de ce que vous pouvez faire avec Java !
Qu'est-ce qu'un Teeing Collector ?
Avant de plonger dans les profondeurs, commençons par les bases. Imaginez que vous êtes dans un restaurant chic et que le serveur vous apporte une théière avec deux becs. C'est un peu ce qu'est un Teeing Collector dans Java – c'est une manière de verser vos données dans deux "cups" (ou opérations) différentes en même temps !
En termes de Java, un Teeing Collector vous permet d'appliquer deux collecteurs indépendants à la même entrée et de combiner ensuite leurs résultats. C'est comme avoir deux assistants travaillant sur la même tâche mais se concentrant sur des aspects différents, et puis vous combinez leur travail à la fin.
La Méthode Collectors.teeing()
Java a introduit la méthode Collectors.teeing()
dans Java 12. Elle fait partie de l'API Stream, qui est un outil puissant pour le traitement des collections de données. Analysons sa syntaxe :
Syntaxe
public 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)
Ne laissez pas cette syntaxe intimidante vous effrayer ! Analysons-la :
-
T
: Le type des éléments d'entrée -
R1
: Le type de résultat du premier collecteur -
R2
: Le type de résultat du second collecteur -
R
: Le type de résultat final
La méthode prend trois paramètres :
-
downstream1
: Le premier collecteur -
downstream2
: Le second collecteur -
merger
: Une fonction pour combiner les résultats des deux collecteurs
Maintenant, voyons cela en action avec quelques exemples !
Exemple 1 : Calculer la Moyenne et le Compte
Imaginez que vous êtes un enseignant (comme moi !) et que vous souhaitez calculer à la fois la note moyenne de vos élèves et le nombre d'élèves que vous avez. Voici comment nous pouvons le faire avec un Teeing Collector :
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class StudentScoreAnalyzer {
public static void main(String[] args) {
List<Integer> scores = Arrays.asList(85, 90, 78, 92, 88);
var result = scores.stream().collect(
Collectors.teeing(
Collectors.averagingInt(Integer::intValue),
Collectors.counting(),
(average, count) -> String.format("Average: %.2f, Count: %d", average, count)
)
);
System.out.println(result);
}
}
Analysons cela :
- Nous commençons par une liste de notes d'élèves.
- Nous utilisons
scores.stream()
pour créer un flux de ces notes. - Nous appliquons
Collectors.teeing()
avec deux collecteurs :
-
Collectors.averagingInt(Integer::intValue)
calcule la note moyenne. -
Collectors.counting()
compte le nombre de notes.
- La fonction de fusion combine ces résultats dans une chaîne de caractères formatée.
Lorsque vous exécutez cela, vous verrez un résultat similaire à :
Average: 86.60, Count: 5
N'est-ce pas pratique ? Avec seulement quelques lignes de code, nous avons calculé deux métriques différentes à partir de nos données !
Exemple 2 : Trouver les Plus Basses et les Plus Hautes Notes
Maintenant, imaginez que vous souhaitez trouver à la fois les notes les plus basses et les plus élevées de votre classe. Nous pouvons le faire avec une seule opération de flux utilisant un Teeing Collector :
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class StudentScoreAnalyzer {
public static void main(String[] args) {
List<Integer> scores = Arrays.asList(85, 90, 78, 92, 88);
var result = scores.stream().collect(
Collectors.teeing(
Collectors.minBy(Integer::compareTo),
Collectors.maxBy(Integer::compareTo),
(min, max) -> String.format("Lowest: %d, Highest: %d", min.orElse(0), max.orElse(0))
)
);
System.out.println(result);
}
}
Dans cet exemple :
- Nous utilisons la même liste de notes.
- Notre premier collecteur,
Collectors.minBy(Integer::compareTo)
, trouve la note minimale. - Notre second collecteur,
Collectors.maxBy(Integer::compareTo)
, trouve la note maximale. - La fonction de fusion combine ces résultats dans une chaîne de caractères formatée, en utilisant
orElse(0)
pour gérer le cas où la liste pourrait être vide.
L'exécution de cela vous donnera :
Lowest: 78, Highest: 92
Pourquoi Utiliser les Teeing Collectors ?
Vous vous demandez peut-être, "Pourquoi se donner tant de mal ? Ne pourrions-nous juste faire ces opérations séparément ?" Eh bien, vous le pourriez certainement ! Mais les Teeing Collectors offrent certains avantages :
- Efficacité : Vous avez besoin de traverser les données tylko une fois, ce qui peut être un grand gain de performance pour les grands ensembles de données.
- Lisibilité : Il rend votre code plus concis et plus facile à comprendre à la première vue.
- Flexibilité : Vous pouvez combiner n'importe quels deux collecteurs de manière créative pour résoudre des problèmes complexes.
Applications Pratiques
Les Teeing Collectors ne sont pas seulement pour des exemples simples comme ceux-ci. Ils peuvent être extrêmement utiles dans des scénarios réels :
- Dans les applications financières, vous pourriez les utiliser pour calculer à la fois le total et la moyenne des transactions en un seul passage.
- Dans l'analyse de données, vous pourriez les utiliser pour trouver à la fois la médiane et la modalité d'un ensemble de données simultanément.
- Dans le développement de jeux, vous pourriez suivre à la fois le score le plus élevé et le nombre de joueurs qui l'ont atteint.
Conclusion
Et voilà, les amis ! Nous avons plongé profondément dans le monde des Teeing Collectors de Java. Nous avons vu comment ils peuvent nous aider à effectuer deux opérations en même temps et à combiner les résultats, le tout dans une seule opération de flux efficace.
N'oubliez pas, la programmation est tout sobre la résolution de problèmes, et les Teeing Collectors ne sont qu'un autre outil dans votre boîte à outils de résolution de problèmes. Plus vous pratiquerez avec eux, plus vous trouverez de manières créatives pour les utiliser dans vos propres projets.
Continuez à coder, à apprendre, et surtout, amusez-vous bien ! Qui sait ? Peut-être un jour vous enseignerez Java aussi, en partageant vos propres expériences et vos mauvais jeux de mots avec une nouvelle génération de programmeurs. À la prochaine fois, bon codage ! ?????
Credits: Image by storyset