Verwendung der Stream API zur Sortierprüfung
In diesem Schritt werden wir einen moderneren und oft kompakteren Weg erkunden, um zu prüfen, ob eine Liste sortiert ist, indem wir die Stream API von Java nutzen. Die Stream API, die in Java 8 eingeführt wurde, bietet einen funktionalen Ansatz zur Verarbeitung von Datenkollektionen.
Wir werden unser vorheriges Programm erweitern, um eine Methode hinzuzufügen, die prüft, ob die Liste in aufsteigender Reihenfolge sortiert ist, indem sie Streams verwendet.
Öffnen Sie die Datei ListComparison.java
im Editor der WebIDE. Fügen Sie der ListComparison
-Klasse eine neue Methode namens isSortedAscending
hinzu, außerhalb der main
-Methode, aber innerhalb der geschweiften Klammern {}
der ListComparison
-Klasse.
Hier ist der aktualisierte Code für 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);
}
}
Schauen wir uns die neuen Teile an:
import java.util.stream.IntStream;
: Dies importiert die IntStream
-Klasse, die nützlich ist, um mit Sequenzen von Ganzzahlen in Streams zu arbeiten.
public static boolean isSortedAscending(List<Integer> list)
: Dies deklariert eine neue statische Methode namens isSortedAscending
, die eine List
von Integer
entgegennimmt und einen boolean
zurückgibt (true, wenn sortiert, false sonst).
if (list == null || list.size() <= 1)
: Dies behandelt Randfälle: Eine leere Liste oder eine Liste mit einem Element wird immer als sortiert betrachtet.
IntStream.range(0, list.size() - 1)
: Dies erstellt einen Stream von Ganzzahlen von 0 bis (aber nicht einschließlich) list.size() - 1
. Diese Ganzzahlen repräsentieren die Indizes der Listenelemente, die wir vergleichen möchten.
.allMatch(i -> list.get(i).compareTo(list.get(i + 1)) <= 0)
: Dies ist der Kern der Stream-Operation.
allMatch()
ist eine Terminal-Operation, die prüft, ob alle Elemente im Stream einer gegebenen Bedingung entsprechen.
i -> list.get(i).compareTo(list.get(i + 1)) <= 0
ist ein Lambda-Ausdruck, der die Bedingung definiert. Für jeden Index i
aus dem IntStream
wird das Element am Index i
und das Element am Index i + 1
abgerufen.
list.get(i).compareTo(list.get(i + 1))
vergleicht die beiden Elemente. compareTo
gibt eine negative Ganzzahl zurück, wenn das erste Element kleiner als das zweite ist, null, wenn sie gleich sind, und eine positive Ganzzahl, wenn das erste Element größer als das zweite ist.
<= 0
prüft, ob das Ergebnis von compareTo
kleiner oder gleich null ist. Diese Bedingung ist wahr, wenn das aktuelle Element kleiner oder gleich dem nächsten Element ist, was die Definition der aufsteigenden Reihenfolge ist.
allMatch
gibt nur dann true
zurück, wenn diese Bedingung für alle benachbarten Elementpaare in der Liste wahr ist.
Speichern Sie die Datei ListComparison.java
.
Jetzt kompilieren und führen Sie das aktualisierte Programm im Terminal aus:
javac ListComparison.java
java ListComparison
Die Ausgabe sollte nun anzeigen, ob die Liste in aufsteigender Reihenfolge sortiert ist, basierend auf der isSortedAscending
-Methode:
Original list: [1, 3, 2, 4, 5]
The list is NOT sorted in ascending order.
Ändern Sie die Liste in der main
-Methode so, dass sie sortiert ist, beispielsweise:
List<Integer> numbers = new ArrayList<>();
numbers.add(1);
numbers.add(2);
numbers.add(3);
numbers.add(4);
numbers.add(5);
Speichern Sie die Datei, kompilieren und führen Sie es erneut aus. Die Ausgabe sollte nun lauten:
Original list: [1, 2, 3, 4, 5]
The list is sorted in ascending order.
Dies zeigt, wie man die Stream API verwendet, um eine kompakte Prüfung auf aufsteigende Reihenfolge durchzuführen.