Utiliser l'API Stream pour vérifier le tri
Dans cette étape, nous explorerons une méthode plus moderne et souvent plus concise pour vérifier si une liste est triée en utilisant l'API Stream de Java. L'API Stream, introduite en Java 8, offre une approche fonctionnelle pour traiter des collections de données.
Nous allons modifier notre programme précédent pour inclure une méthode qui vérifie si la liste est triée par ordre croissant en utilisant les flux (streams).
Ouvrez le fichier ListComparison.java
dans l'éditeur de l'IDE Web. Ajoutez une nouvelle méthode appelée isSortedAscending
à la classe ListComparison
, en dehors de la méthode main
mais à l'intérieur des accolades {}
de la classe ListComparison
.
Voici le code mis à jour pour ListComparison.java
:
import java.util.ArrayList;
import java.util.List;
import java.util.stream.IntStream;
public class ListComparison {
public static void main(String[] args) {
List<Integer> numbers = new ArrayList<>();
numbers.add(1);
numbers.add(3);
numbers.add(2);
numbers.add(4);
numbers.add(5);
System.out.println("Original list: " + numbers);
// Check if the list is sorted using the new method
boolean sorted = isSortedAscending(numbers);
if (sorted) {
System.out.println("The list is sorted in ascending order.");
} else {
System.out.println("The list is NOT sorted in ascending order.");
}
// The previous loop for comparison is removed for simplicity in this step
// but you can keep it if you want to see both methods in action.
}
// Method to check if the list is sorted in ascending order using Streams
public static boolean isSortedAscending(List<Integer> list) {
if (list == null || list.size() <= 1) {
return true; // An empty or single-element list is considered sorted
}
return IntStream.range(0, list.size() - 1)
.allMatch(i -> list.get(i).compareTo(list.get(i + 1)) <= 0);
}
}
Examinons les nouvelles parties :
import java.util.stream.IntStream;
: Cela importe la classe IntStream
, qui est utile pour travailler avec des séquences d'entiers dans les flux.
public static boolean isSortedAscending(List<Integer> list)
: Cela déclare une nouvelle méthode statique nommée isSortedAscending
qui prend une List
d'Integer
et renvoie un boolean
(true si triée, false sinon).
if (list == null || list.size() <= 1)
: Cela gère les cas limites : une liste vide ou une liste avec un seul élément est toujours considérée comme triée.
IntStream.range(0, list.size() - 1)
: Cela crée un flux d'entiers de 0 jusqu'à (mais sans inclure) list.size() - 1
. Ces entiers représentent les indices des éléments de la liste que nous voulons comparer.
.allMatch(i -> list.get(i).compareTo(list.get(i + 1)) <= 0)
: C'est le cœur de l'opération de flux.
allMatch()
est une opération terminale qui vérifie si tous les éléments du flux correspondent à une condition donnée.
i -> list.get(i).compareTo(list.get(i + 1)) <= 0
est une expression lambda qui définit la condition. Pour chaque index i
du IntStream
, elle récupère l'élément à l'index i
et l'élément à l'index i + 1
.
list.get(i).compareTo(list.get(i + 1))
compare les deux éléments. compareTo
renvoie un entier négatif si le premier élément est inférieur au deuxième, zéro s'ils sont égaux et un entier positif si le premier élément est supérieur au deuxième.
<= 0
vérifie si le résultat de compareTo
est inférieur ou égal à zéro. Cette condition est vraie si l'élément actuel est inférieur ou égal à l'élément suivant, ce qui est la définition de l'ordre croissant.
allMatch
renvoie true
seulement si cette condition est vraie pour toutes les paires adjacentes de la liste.
Enregistrez le fichier ListComparison.java
.
Maintenant, compilez et exécutez le programme mis à jour dans le terminal :
javac ListComparison.java
java ListComparison
La sortie devrait maintenant indiquer si la liste est triée par ordre croissant en fonction de la méthode isSortedAscending
:
Original list: [1, 3, 2, 4, 5]
The list is NOT sorted in ascending order.
Modifiez la liste dans la méthode main
pour qu'elle soit triée, par exemple :
List<Integer> numbers = new ArrayList<>();
numbers.add(1);
numbers.add(2);
numbers.add(3);
numbers.add(4);
numbers.add(5);
Enregistrez le fichier, compilez et exécutez à nouveau. La sortie devrait maintenant être :
Original list: [1, 2, 3, 4, 5]
The list is sorted in ascending order.
Cela démontre comment utiliser l'API Stream pour effectuer une vérification concise de l'ordre croissant.