logo

anyMatch() i Java 8

I Java 8 er anyMatch() en metode definert i Stream-grensesnittet. Den utfører en kortslutningsterminaldrift. I denne delen vil vi diskutere anyMatch()-metoden i Java 8 Stream med et eksempel. Før vi går til poenget, vil vi først forstå mellom- og terminaloperasjonene i detalj.

I Java 8 stream er strømmeoperasjonene delt inn i mellomliggende (som Stream.filter, Stream.map) og terminal (som Stream.forEach, Steam.reduce) operasjoner. For å få de ønskede resultatene, må vi kombinere disse operasjonene som danner strømrørledninger.

Mellomliggende operasjoner

Mellomliggende operasjoner er late (betyr, utfører ikke selve operasjonen, i stedet returnerer en ny strøm) i naturen. Det betyr å beholde elementene i den innledende strømmen og alltid returnere en ny strøm av den innledende strømmen. Merk at utførelsen av rørledningen ikke begynner før terminaldriften av rørledningen er utført.

Mellomoperasjoner er videre delt inn i statsløs operasjoner (som filter og kart) og statelig operasjoner (som distinkt og sortert).

Statsløs operasjon

De statsløse operasjonene beholder ikke tilstanden fra tidligere sett elementer mens de behandler et nytt element. Hvert element kan behandles uavhengig av operasjoner på andre elementer.

Stateful Operation

De statlige operasjonene beholder staten fra tidligere sett elementer mens de behandler de nye elementene. Egenskapen til den stateful operasjonen er at den behandler hele input før den produserer et resultat.

Anta at vi utfører sorteringsoperasjonen over strømmen og ønsker å produsere resultatet fra den strømmen uten å se alle elementene i strømmen, noe som ikke er mulig. Derfor, før man ikke ser alle elementene i strømmen, kan man ikke produsere resultatet. Derfor må vi behandle hele innspillet før vi produserer resultatet.

Terminaldrift

Terminaloperasjoner krysser strømmen for å produsere et resultat eller bivirkning. Så snart terminaloperasjonen er utført, anses strømrørledningen som forbrukt. Etter forbruk kan den ikke lenger brukes. I tilfelle vi krever å krysse den samme datakilden (strømmen), returner strømmen for å få en ny strøm.

Nesten alle terminaloperasjoner er ivrige i naturen. Det betyr at de krysser strømmen og behandler rørledningen før de returnerer. Merk at det ikke er tillatt i operasjoner med to terminaler, dvs. iterator() og spliterator().

Foruten de ovennevnte operasjonene, er det en annen operasjon kjent som kortslutning operasjon. Både mellom- og terminaloperasjoner kan kortslutte.

An mellomoperasjon er kortslutning hvis det er en strøm med uendelig inngang. Det kan produsere en begrenset strøm som et resultat.

EN terminaldrift er kortslutning hvis det er en strøm med uendelig inngang. Det kan avsluttes i en begrenset tid.

Vi observerer at bruk av en kortslutningsoperasjon i rørledningen er avgjørende, men ikke tilstrekkelig. Det er en betingelse for å behandle en uendelig strøm altså avslutte driften normalt på begrenset tid.

Java 8 Stream.anyMatch()

Den returnerer om noen elementer i denne strømmen samsvarer med det angitte predikatet. Den evaluerer kanskje ikke predikatet på alle elementer hvis det ikke er nødvendig for å bestemme resultatet.

Syntaks:

 boolean anyMatch(Predicate predicate) 

Parametere: Den godtar en ikke forstyrrende og statsløs predikat som skal brukes på elementer i inngangsstrømmen.

Returnerer: Den kommer tilbake ekte hvis et element samsvarer med det spesifiserte predikatet, returnerer else false. Returnerer usann hvis strømmen er tom. I tilfelle av en tom strøm, blir ikke predikatet evaluert.

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); } } 

Produksjon:

opprettelse av orakelbord
 true 

Følgende eksempel viser en tom strøm som alltid 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); } } 

Produksjon:

 false 

La oss se et annet Java-program der vi har analysert flere predikater.

For å tilfredsstille flere betingelser, lag et sammensatt predikat med to eller flere enkle predikater. I det gitte eksemplet har vi en liste over ansatte. Vi ønsker å sjekke om det er en ansatt som er 28 år gammel 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, &apos;Andrew&apos;)); list.add(new Employee(23, 28, &apos;Robert&apos;)); list.add(new Employee(32, 29, &apos;Jack&apos;)); list.add(new Employee(12, 31, &apos;Steve&apos;)); list.add(new Employee(15, 27, &apos;Tom&apos;)); list.add(new Employee(19, 29, &apos;Albert&apos;)); return list; } } //driver code public class AnyMatchExample { public static void main(String args[]) { //defining predicates Predicate p1 = e -&gt; e.empName.startsWith(&apos;S&apos;); Predicate p2 = e -&gt; e.empAge <28 && e.empname.startswith('r'); predicate p3="e" -> e.empName.startsWith(&apos;P&apos;); 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>

Produksjon:

 true true false 

Stream-grensesnittet gir en annen metode for å matche det spesifiserte predikatet, dvs. allMatch() . Forskjellen mellom allMatch() og anyMatch() er at anyMatch() returnerer ekte hvis noen av elementene i en strøm samsvarer med det angitte predikatet. Når du bruker allMatch(), må alle elementene samsvare med det gitte predikatet.

Derfor kan anyMatch()-metoden brukes i det enkelte tilfellet når vi ønsker å sjekke om det er minst ett element i strømmen. Metoden contains() i List-klassen utfører også den samme operasjonen. Så vi kan også bruke contains()-metoden i stedet for anyMatch()-metoden.

Derfor er det ingen forskjell mellom List.contains() og Stream.anyMatch()-metoden.