La programmation fonctionnelle est une approche largement utilisée dans le développement de logiciels modernes. Java, étant un langage qui prend en charge à la fois la programmation orientée objet et fonctionnelle, a introduit les flux et les lambdas dans sa 8ème version. Ces fonctionnalités permettent aux développeurs d'appliquer un style fonctionnel aux collections, rendant les opérations sur les collections plus efficaces et plus propres.
Flux en Java
Les flux en Java transforment une collection en un flux d'éléments. Ils permettent aux développeurs d'effectuer des opérations fonctionnelles sur les collections telles que le mappage, le filtrage et la réduction. Les flux sont mieux utilisés pour les opérations qui impliquent la transformation, l'agrégation ou le filtrage des données.
Un exemple d'utilisation de flux consiste à trier une liste de noms par ordre alphabétique. Nous pouvons créer une liste de noms, puis utiliser des flux pour les trier comme indiqué ci-dessous :
Liste
noms.stream().sorted().forEach(System.out::println); //sortie : David, Emily, John, Mary, Tom
Ici, nous avons créé un flux en utilisant la méthode stream() sur la liste. Nous avons ensuite appliqué la méthode sorted() pour trier les éléments du flux dans l’ordre naturel. Enfin, la méthode forEach() est utilisée pour imprimer chaque élément du flux.
Lambdas en Java
Les lambdas sont utilisés pour définir des fonctions de première classe en Java. Ces fonctions peuvent consommer des éléments d'un flux et effectuer des opérations sur ceux-ci. Les lambdas sont définis en dehors d'une classe et peuvent être passés comme arguments aux fonctions.
Pour utiliser des lambdas avec des flux, nous devons comprendre le concept d'interfaces fonctionnelles. Ce sont des interfaces qui n'ont qu'une seule méthode abstraite. Les expressions Lambda peuvent être utilisées pour fournir une implémentation concrète de la méthode abstraite d'une interface fonctionnelle.
Trier une liste de noms à l'aide de lambdas
En nous basant sur l'exemple ci-dessus, trions les noms par ordre décroissant à l'aide de lambdas.
Liste
noms.stream().sorted((a, b) -> b.compareTo(a)).forEach(System.out::println)); //sortie : Tom, Mary, John, Emily, David
Ici, nous avons utilisé une expression lambda comme argument de la méthode sorted(). Cette fonction lambda accepte deux arguments (a et b) et les compare, renvoyant une valeur positive, négative ou nulle en fonction de la comparaison. Cela nous permet de trier les éléments par ordre décroissant en utilisant la méthode compareTo() sur les éléments.
Transformer un flux en collection
Dans certains cas, nous pouvons souhaiter reconvertir un flux en collection après avoir effectué des opérations dessus. Nous pouvons le faire en utilisant la méthode collect(), qui prend un objet Collector comme argument.
Liste
.filter(name -> name.length() > 4) //conserver uniquement les noms de longueur > 4
.collect(Collectors.toList()); //renvoie une liste de noms filtrés
La méthode collect() prend une interface fonctionnelle de type Collector et l'utilise pour accumuler des éléments dans une collection. Dans l'exemple ci-dessus, nous avons utilisé la méthode toList() de la classe Collectors pour créer une liste de noms filtrés.
Autres opérations sur les flux
Outre le tri et le filtrage, d'autres opérations peuvent être effectuées sur les flux, telles que le mappage, la réduction et l'itération. Ces opérations nous permettent respectivement de transformer, de réduire et de parcourir les éléments d'un flux.
Cartographe et réduction d'un flux de chiffres
Disons que nous avons une liste de nombres et que nous voulons trouver la somme de tous les nombres pairs. Nous pouvons le faire en utilisant les méthodes map() et réduire().
Liste
int somme = nombres.stream()
.filter(num -> num % 2 == 0) // filtrer les nombres impairs
.map(num -> num * 2) //double les nombres pairs
.reduce(0, (a, b) -> a + b); //additionne tous les nombres ensemble
Ici, nous avons utilisé la méthode map() pour doubler les nombres pairs dans le flux, puis la méthode réduire() pour additionner tous les nombres. Le résultat est une somme de tous les nombres pairs de la liste.
Opérations de réutilisation sur les flux
Dans certains cas, nous pourrons être amenés à utiliser la même opération fonctionnelle sur plusieurs flux. Pour éviter d'écrire encore et encore le même code, on peut créer une interface fonctionnelle et la passer en argument aux méthodes.
Prenons l'exemple du tri d'une liste de noms par nom de famille. Nous pouvons créer une classe comparateur qui implémente l'interface Comparator et la transmettre comme argument à la méthode sorted().
classe statique LastNameComparator implémente Comparator
@Override
public int comparer (nom de chaîne1, nom de chaîne2) {
String[] parts1 = nom1.split(" ");
Chaîne lastName1 = parts1[parts1.length - 1];
String[] parts2 = nom2.split(" ");
Chaîne lastName2 = parts2[parts2.length - 1];
return lastName2.compareTo(lastName1);
>
>
noms.stream().sorted(new LastNameComparator()).forEach(System.out::println); //sortie : Emily, David, John, Mary, Tom
Ici, nous avons passé le LastNameComparator comme argument à la méthode sorted() pour trier les noms par nom de famille.
Conclusion
Les flux et les lambdas en Java offrent un moyen puissant et efficace d'effectuer des opérations fonctionnelles sur les collections. Ils permettent aux développeurs d'écrire du code propre, concis et réutilisable. En comprenant les concepts de flux et de lambdas, nous pouvons améliorer nos compétences globales en codage et écrire un code plus efficace.
Une méthode efficace pour améliorer vos compétences Java consiste à obtenir la dernière certification Java et à utiliser les tests pratiques 1Z0-830 disponibles sur MyExamCloud.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!