In Java 8 ist anyMatch() eine in der Stream-Schnittstelle definierte Methode. Es führt eine Kurzschlussklemmenbetrieb. In diesem Abschnitt werden wir das besprechen anyMatch()-Methode in Java 8 Stream mit einem Beispiel. Bevor wir zum Punkt kommen, werden wir zunächst die Zwischen- und Endoperationen im Detail verstehen.
Im Java 8-Stream sind die Stream-Operationen unterteilt in: dazwischenliegend (wie Stream.filter, Stream.map) und Terminal (wie Stream.forEach, Steam.reduce) Operationen. Um die gewünschten Ergebnisse zu erzielen, müssen wir diese Vorgänge kombinieren, die Stream-Pipelines bilden.
Zwischenoperationen
Zwischenoperationen sind von Natur aus verzögert (d. h. sie führen nicht die eigentliche Operation aus, sondern geben stattdessen einen neuen Stream zurück). Das bedeutet, dass die Elemente des ursprünglichen Streams beibehalten werden und immer ein neuer Stream des ursprünglichen Streams zurückgegeben wird. Beachten Sie, dass die Ausführung der Pipeline erst beginnt, wenn die Terminaloperation der Pipeline ausgeführt wird.
Zwischenoperationen werden weiter unterteilt in staatenlos Operationen (wie Filter und Karte) und Staatsbürgerlich Operationen (wie eindeutig und sortiert).
Staatenloser Betrieb
Die zustandslosen Operationen behalten den Status zuvor gesehener Elemente nicht bei, während ein neues Element verarbeitet wird. Jedes Element kann unabhängig von Operationen an anderen Elementen verarbeitet werden.
Zustandsbehafteter Betrieb
Die zustandsbehafteten Operationen behalten den Zustand früher gesehener Elemente bei, während sie die neuen Elemente verarbeiten. Die Eigenschaft der zustandsbehafteten Operation besteht darin, dass sie die gesamte Eingabe verarbeitet, bevor sie ein Ergebnis erzeugt.
die Zahlen des Alphabets
Angenommen, wir führen den Sortiervorgang für den Stream durch und möchten das Ergebnis aus diesem Stream erzeugen, ohne alle Elemente des Streams zu sehen, was nicht möglich ist. Daher kann man kein Ergebnis erzielen, solange man nicht alle Elemente des Streams sieht. Daher müssen wir die gesamte Eingabe verarbeiten, bevor wir das Ergebnis erzeugen.
Terminalbetrieb
Terminaloperationen durchlaufen den Stream, um ein Ergebnis oder einen Nebeneffekt zu erzeugen. Sobald der Terminalvorgang ausgeführt wird, gilt die Stream-Pipeline als verbraucht. Nach dem Verzehr kann es nicht mehr verwendet werden. Falls wir dieselbe Datenquelle (Stream) durchlaufen müssen, geben Sie den Stream zurück, um einen neuen Stream zu erhalten.
Fast alle Terminaloperationen sind eifriger Natur. Das bedeutet, dass sie den Stream durchqueren und die Pipeline verarbeiten, bevor sie zurückkehren. Beachten Sie, dass dies in Zwei-Terminal-Operationen, d. h. iterator() und spliterator(), nicht zulässig ist.
Neben den oben genannten Operationen gibt es noch eine weitere Operation namens Kurzschluss Betrieb. Sowohl bei Zwischen- als auch bei Endoperationen kann es zu Kurzschlüssen kommen.
Ein Zwischenbetrieb ist kurzschließend, wenn es einen Strom mit unendlichem Eingang gibt. Dadurch kann ein endlicher Strom entstehen.
A Terminalbetrieb ist kurzschließend, wenn es einen Strom mit unendlichem Eingang gibt. Es kann in einer endlichen Zeit enden.
Wir stellen fest, dass die Verwendung eines Kurzschlussvorgangs in der Pipeline zwar unerlässlich, aber nicht ausreichend ist. Es gibt eine Bedingung für die Verarbeitung eines unendlichen Streams Beenden Sie den Vorgang normal in endlicher Zeit.
Java 8 Stream.anyMatch()
Es gibt zurück, ob irgendwelche Elemente dieses Streams mit dem bereitgestellten Prädikat übereinstimmen. Es kann sein, dass das Prädikat nicht für alle Elemente ausgewertet wird, wenn dies für die Bestimmung des Ergebnisses nicht erforderlich ist.
Syntax:
boolean anyMatch(Predicate predicate)
Parameter: Es akzeptiert a nicht störend Und staatenlos Prädikat, das auf Elemente des Eingabestreams angewendet werden soll.
Kehrt zurück: Es kehrt zurück WAHR Wenn ein Element mit dem angegebenen Prädikat übereinstimmt, wird sonst „false“ zurückgegeben. Gibt false zurück, wenn der Stream leer ist. Bei einem leeren Stream wird das Prädikat nicht ausgewertet.
Beispiel für Java anyMatch()
AnyMatchExample1.java
import java.util.stream.Stream; public class AnyMatchExample1 { public static void main(String args[]) { Stream stream = Stream.of('Java', 'Python', 'Hadoop', 'C#', 'C++', 'Kotlin'); boolean match = stream.anyMatch(s -> s.contains('Python')); System.out.println(match); } }
Ausgabe:
true
Das folgende Beispiel zeigt, dass ein leerer Stream immer „false“ zurückgibt.
AnyMatchExample2.java
import java.util.Arrays; public class AnyMatchExample2 { public static void main(String args[]) { boolean b = Arrays.asList().stream().anyMatch(e -> true); System.out.println(b); } }
Ausgabe:
false
Sehen wir uns ein weiteres Java-Programm an, in dem wir mehrere Prädikate analysiert haben.
Um mehrere Bedingungen zu erfüllen, erstellen Sie ein zusammengesetztes Prädikat mit zwei oder mehr einfachen Prädikaten. Im gegebenen Beispiel haben wir eine Liste von Mitarbeitern. Wir möchten prüfen, ob es einen Mitarbeiter gibt, der 28 Jahre alt ist und dessen Name mit dem Alphabet R beginnt. Das folgende Java-Programm zeigt dasselbe.
AnyMatchExample.java
import java.util.List; import java.util.function.Predicate; import java.util.ArrayList; class Employee { int empId; int empAge; String empName; //creating a constructor of the Employee class Employee(int id, int age, String name) { this.empId = id; this.empAge = age; this.empName = name; } public int getEmpId() { return empId; } public int getEmpAge() { return empAge; } public String getEmpName() { return empName; } public static List getEmployee() { //instance of the List class List list = new ArrayList(); //adding elements to the List list.add(new Employee(21, 21, 'Andrew')); list.add(new Employee(23, 28, 'Robert')); list.add(new Employee(32, 29, 'Jack')); list.add(new Employee(12, 31, 'Steve')); list.add(new Employee(15, 27, 'Tom')); list.add(new Employee(19, 29, 'Albert')); return list; } } //driver code public class AnyMatchExample { public static void main(String args[]) { //defining predicates Predicate p1 = e -> e.empName.startsWith('S'); Predicate p2 = e -> e.empAge <28 && e.empname.startswith('r'); predicate p3="e" -> e.empName.startsWith('P'); List list = Employee.getEmployee(); //anyMatch() method checks whether any Stream element matches the specified predicate boolean bool1 = list.stream().anyMatch(p1); //prints true if any element of the List starts with the letter s, else prints false System.out.println(bool1); boolean bool2 = list.stream().anyMatch(p2); //prints true if any element of the List starts with the letter z and age is less than 28, else prints false System.out.println(bool2); //anyMatch() method checks whether any Stream element matches the specified predicate boolean bool3 = list.stream().anyMatch(p3); //prints true if any element of the List starts with the letter P, else prints false System.out.println(bool3); } } </28>
Ausgabe:
true true false
Die Stream-Schnittstelle bietet eine weitere Methode zum Abgleichen des angegebenen Prädikats, d. h. allMatch() . Der Unterschied zwischen allMatch() und anyMatch() besteht darin, dass anyMatch() zurückgibt WAHR wenn eines der Elemente in einem Stream mit dem angegebenen Prädikat übereinstimmt. Bei Verwendung von allMatch() müssen alle Elemente mit dem angegebenen Prädikat übereinstimmen.
Daher kann die Methode anyMatch() in bestimmten Fällen verwendet werden, wenn wir prüfen möchten, ob mindestens ein Element im Stream vorhanden ist. Die Methode „contains()“ der Klasse „List“ führt ebenfalls den gleichen Vorgang aus. Wir können also auch die Methode „contains()“ anstelle der Methode „anyMatch()“ verwenden.
Daher gibt es keinen Unterschied zwischen der List.contains()- und der Stream.anyMatch()-Methode.