I Java 8 er anyMatch() en metode defineret i Stream-grænsefladen. Den udfører en kortslutningsterminaldrift. I dette afsnit vil vi diskutere anyMatch()-metoden i Java 8 Stream med et eksempel. Før vi går til sagen, vil vi først forstå mellem- og terminaloperationerne i detaljer.
I Java 8 stream er stream operationerne opdelt i mellemliggende (som Stream.filter, Stream.map) og terminal (som Stream.forEach, Steam.reduce) operationer. For at opnå de ønskede resultater er vi nødt til at kombinere disse operationer, der danner strømrørledninger.
Mellemliggende operationer
Mellemliggende operationer er dovne (betyder, udfører ikke selve operationen, i stedet returnerer en ny strøm) i naturen. Det betyder at beholde elementerne fra den indledende strøm og altid returnere en ny strøm af den indledende strøm. Bemærk, at udførelsen af rørledningen ikke begynder, før terminaldriften af rørledningen er udført.
Mellemliggende operationer er yderligere opdelt i statsløs operationer (som filter og kort) og statelig operationer (som adskilt og sorteret).
Statsløs Operation
De statsløse operationer bevarer ikke tilstanden fra tidligere sete elementer, mens de behandler et nyt element. Hvert element kan behandles uafhængigt af operationer på andre elementer.
Stateful Operation
De statelige operationer bevarer staten fra tidligere sete elementer, mens de behandler de nye elementer. Egenskaben ved den stateful operation er, at den behandler hele input, før den producerer et resultat.
Antag, at vi udfører sorteringsoperationen over strømmen og ønsker at producere resultatet fra den strøm uden at se alle elementer i strømmen, hvilket ikke er muligt. Derfor, indtil man ikke ser alle strømmens elementer, kan man ikke producere resultatet. Derfor skal vi behandle hele inputtet, før vi producerer resultatet.
Terminaldrift
Terminaloperationer krydser strømmen for at frembringe et resultat eller bivirkning. Så snart terminaloperationen er udført, anses strømrørledningen for at være forbrugt. Efter indtagelse kan den ikke længere bruges. I tilfælde af at vi har brug for at krydse den samme datakilde (stream), returner streamen for at få en ny stream.
Næsten alle terminaloperationer er ivrige af natur. Det betyder, at de krydser strømmen og behandler rørledningen, før de vender tilbage. Bemærk, at det ikke er tilladt i to-terminal operationer, dvs. iterator() og spliterator().
Udover ovenstående operationer er der en anden operation kendt som kortslutning operation. Både mellem- og terminaloperationer kan kortslutte.
An mellemdrift er kortslutning, hvis der er en strøm med uendelig input. Det kan producere en begrænset strøm som et resultat.
EN terminaldrift er kortslutning, hvis der er en strøm med uendelig input. Det kan ophøre på en begrænset tid.
Vi bemærker, at brug af en kortslutningsoperation i rørledningen er væsentlig, men ikke tilstrækkelig. Der er en betingelse for at behandle en uendelig strøm, dvs afslutte driften normalt i begrænset tid.
Java 8 Stream.anyMatch()
Det returnerer, om nogen elementer i denne strøm matcher det angivne prædikat. Den evaluerer muligvis ikke prædikatet på alle elementer, hvis det ikke er nødvendigt for at bestemme resultatet.
Syntaks:
boolean anyMatch(Predicate predicate)
Parametre: Den accepterer en ikke forstyrrende og statsløs prædikat, der skal anvendes på elementer i inputstrømmen.
Vender tilbage: Det vender tilbage rigtigt hvis et element matcher det angivne prædikat, returnerer ellers falsk. Returnerer falsk, hvis strømmen er tom. I tilfælde af en tom strøm bliver prædikatet ikke evalueret.
Java anyMatch() Eksempel
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); } }
Produktion:
java sammenlignelig
true
Følgende eksempel viser en tom strøm, der altid returnerer falsk.
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); } }
Produktion:
false
Lad os se et andet Java-program, hvor vi har analyseret flere prædikater.
For at opfylde flere betingelser skal du oprette et sammensat prædikat med to eller flere simple prædikater. I det givne eksempel har vi en liste over medarbejdere. Vi vil gerne tjekke, om der er en medarbejder, hvis alder er 28 år, og navnet starter med alfabetet R. Følgende Java-program viser det samme.
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>
Produktion:
true true false
Stream-grænsefladen giver en anden metode til at matche det specificerede prædikat, dvs. allMatch() . Forskellen mellem allMatch() og anyMatch() er, at anyMatch() returnerer rigtigt hvis nogen af elementerne i en strøm matcher det angivne prædikat. Når du bruger allMatch(), skal alle elementer matche det givne prædikat.
Derfor kan anyMatch()-metoden bruges i det bestemte tilfælde, når vi vil kontrollere, om der er mindst ét element i strømmen. Metoden contains() for klassen List udfører også den samme handling. Så vi kan også bruge contains()-metoden i stedet for anyMatch()-metoden.
Derfor er der ingen forskel mellem List.contains() og Stream.anyMatch()-metoden.