Konvertieren eine Liste in eine Karte in Java
Die API java.util.stream
wurde in Java 8 eingeführt; Es wird verwendet, um eine Sammlung von Objekten zu verarbeiten. Verschiedene Quellen wie Arrays oder Sammlungen können einen Stream erstellen.
Hier werden wir uns die Stream-Methoden findFirst()
und findAny()
genau ansehen und wann sie verwendet werden.
findFirst()
-Stream-Methode in Java 8
Stream verändert die Originaldaten nicht; Es wertet die Elemente des Streams mithilfe der Pipeline-Methoden aus.
Die Stream-API-Methode findFirst()
ist eine Terminaloperation; es wird beendet und ein Ergebnis zurückgegeben. Wir verwenden die Methode findfFirst()
, wenn wir das erste Element aus der Sequenz benötigen.
Diese Methode gibt ein Optional<T>
zurück, das das erste Element des Streams beschreibt. Hier ist T
der Typ, der String
ist.
Optional
ist ein Containerobjekt; es kann einen Nicht-Null-Wert enthalten oder auch nicht. Wenn der Stream leer ist, ist das zurückgegebene Optional
leer.
Wir erstellen eine Liste von Früchten
und Zahlen
, die Daten vom Typ String
bzw. Integer
enthalten, indem wir die Methode findFirst()
in einem anderen Kontext verwenden. Wir rufen die .stream()
auf der Liste auf, die einen Strom von Listenelementen zurückgibt.
Wir brauchen das erste Element aus dieser Liste, also rufen wir darauf die Methode findFirst()
auf. Es gibt ein Optional
zurück, das wir in first
speichern.
Wir prüfen, ob die Optional
-Instanz einen Wert enthält oder nicht, indem wir die isPresent()
-Methode verwenden, die einen boolean
zurückgibt. Wenn es wahr zurückgibt, haben wir einen Wert, und wir bekommen ihn mit first.get()
und drucken ihn aus. Wenn die Instanz Optional
leer ist, drucken wir keinen Wert.
Die zweite Anweisung numbers.stream().filter((x)->x>5).findFirst()
ergibt eine zweite Optional
-Instanz firstN
. Wir wenden zuerst die Methode filter()
an, um einen gefilterten Stream basierend auf einem gegebenen Prädikat zurückzugeben.
Diese Methode gibt einen neuen Strom von Elementen mit einem Wert größer als 5
zurück. Aus diesem Stream müssen wir das erste Element erhalten. In unserem Fall ist das erste Element mit einem Wert grösser als 5
im Strom der Zahlen
nur noch 8
.
import java.util.List;
import java.util.Optional;
public class StreamTest {
public static void main(String[] args) {
List<String> fruits = List.of("Apple", "Grapes", "Orange", "Kiwi");
List<Integer> numbers = List.of(4, 5, 3, 8);
Optional<String> first = fruits.stream().findFirst();
if (first.isPresent()) {
String string = first.get();
System.out.println("First String is : " + string);
} else {
System.out.println("No value");
}
Optional<Integer> firstN = numbers.stream().filter((x) -> x > 5).findFirst();
if (firstN.isPresent()) {
System.out.println("First Number is : " + firstN.get());
} else {
System.out.println("No value");
}
}
}
Ausgabe:
First String is : Apple
First Number is : 8
findAny()
-Stream-Methode in Java 8
Die Methode findAny()
gibt eine Optional
-Instanz zurück, die ein beliebiges Element des Streams beschreibt. Wir haben eine Liste von Elementen vom Typ Integer
im Programm unten.
Wir erstellen einen Stream aus der Liste und filtern diesen Stream, um Zahlen zurückzugeben, die einen Wert kleiner als 5
haben. Dann rufen wir findAny()
auf, um eine beliebige Zahl aus diesem gefilterten Stream zu erhalten.
In den meisten Fällen wird das erste Element zurückgegeben. Wenn die Optional
Instanz firstN
nicht leer ist, geben wir den Instanzwert aus, den wir mit der get()
-Methode erhalten.
import java.util.List;
import java.util.Optional;
public class StreamTest {
public static void main(String[] args) {
List<Integer> numbers = List.of(4, 5, 2, 8);
Optional<Integer> firstN = numbers.stream().filter((x) -> x < 5).findAny();
if (firstN.isPresent()) {
System.out.println("Any First Number less then 5 is : " + firstN.get());
} else {
System.out.println("No value");
}
}
}
Ausgabe:
Any First Number less then 5 is : 4
Beachten Sie, dass sich sowohl bei sequentiellen als auch bei parallelen Streams das Verhalten der Methoden findAny()
und findFirst()
nicht ändert. Das Verhalten von findAny()
bei nicht parallelen Streams ist nicht garantiert.
Rupam Saini is an android developer, who also works sometimes as a web developer., He likes to read books and write about various things.
LinkedIn