logo

anyMatch() în Java 8

În Java 8, anyMatch() este o metodă definită în interfața Stream. Ea efectuează o scurtcircuitarea funcționării terminalului. În această secțiune, vom discuta despre metoda anyMatch() în Java 8 Stream cu un exemplu. Înainte de a trece la subiect, mai întâi, vom înțelege în detaliu operațiunile intermediare și terminale.

În fluxul Java 8, operațiunile de flux sunt împărțite în intermediar (cum ar fi Stream.filter, Stream.map) și Terminal (cum ar fi Stream.forEach, Steam.reduce) operațiuni. Pentru a obține rezultatele dorite, trebuie să combinăm aceste operațiuni care formează conducte de flux.

Operațiuni intermediare

Operațiunile intermediare sunt leneșe (înseamnă că nu efectuează operația propriu-zisă, ci returnează un nou flux) în natură. Înseamnă, păstrarea elementelor fluxului inițial și returnarea întotdeauna un nou flux al fluxului inițial. Rețineți că execuția conductei nu începe până când nu este executată operațiunea terminală a conductei.

flixerul meu

Operațiunile intermediare sunt împărțite în continuare în Fara stare operațiuni (cum ar fi filtrul și harta) și cu stare operațiuni (cum ar fi distincte și sortate).

Operațiune fără stat

Operațiile fără stat nu rețin starea elementelor văzute anterior în timp ce procesează un element nou. Fiecare element poate fi procesat independent de operațiunile asupra altor elemente.

Operațiune cu stat

Operațiile cu stare rețin starea din elementele văzute anterior în timp ce procesează elementele noi. Proprietatea operației cu stare este că procesează întreaga intrare înainte de a produce un rezultat.

Să presupunem că efectuăm operația de sortare peste flux și dorim să producem rezultatul din acel flux fără a vedea toate elementele fluxului, ceea ce nu este posibil. Prin urmare, până când nu vedem toate elementele fluxului, nu se poate produce rezultatul. Prin urmare, trebuie să procesăm întreaga intrare înainte de a produce rezultatul.

Operarea terminalului

Operațiunile terminale traversează fluxul pentru a produce un rezultat sau un efect secundar. Imediat ce operațiunea terminalului este executată, conducta de flux este considerată consumată. După consum, nu mai poate fi folosit. În cazul în care trebuie să traversăm aceeași sursă de date (flux), returnăm fluxul pentru a obține un nou flux.

Aproape toate operațiunile terminale sunt dornice în natură. Înseamnă că traversează fluxul și procesează conducta înainte de a se întoarce. Rețineți că nu este permis în operațiuni cu două terminale, adică iterator() și spliterator().

if else declarație în java

Pe lângă operațiunile de mai sus, există o altă operațiune cunoscută ca scurtcircuit Operațiune. Atât operațiunile intermediare, cât și cele terminale se pot scurtcircuita.

Un operație intermediară este în scurtcircuit dacă, există un flux cu intrare infinită. Ca rezultat, poate produce un flux finit.

A funcţionarea terminalului este în scurtcircuit dacă, există un flux cu intrare infinită. Se poate termina într-un timp finit.

Observăm că utilizarea unei operațiuni de scurtcircuitare în conductă este esențială, dar nu suficientă. Există o condiție pentru a procesa un flux infinit care este opriți operațiunea în mod normal în timp finit.

Java 8 Stream.anyMatch()

Returnează dacă elementele acestui flux se potrivesc cu predicatul furnizat. Este posibil să nu evalueze predicatul pe toate elementele dacă nu este necesar pentru determinarea rezultatului.

Sintaxă:

 boolean anyMatch(Predicate predicate) 

Parametri: Acceptă a neintervenient și Fara stare predicat care urmează să fie aplicat elementelor fluxului de intrare.

Se intoarce: Se întoarce Adevărat dacă vreun element se potrivește cu predicatul specificat, altfel returnează false. Returnează false, dacă fluxul este gol. În cazul unui flux gol, predicatul nu este evaluat.

Java anyMatch() Exemplu

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

Ieșire:

 true 

Următorul exemplu ilustrează un flux gol returnează întotdeauna false.

AnyMatchExample2.java

ce este internetul
 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); } } 

Ieșire:

 false 

Să vedem un alt program Java în care am analizat mai multe predicate.

Pentru a satisface mai multe condiții, creați un predicat compus cu două sau mai multe predicate simple. În exemplul dat, avem o listă de angajați. Vrem să verificăm dacă există un angajat a cărui vârstă este de 28 de ani și numele începe cu alfabetul R. Următorul program Java descrie același lucru.

AnyMatchExample.java

câte filme cu misiune imposibilă sunt acolo
 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>

Ieșire:

 true true false 

Interfața Stream oferă o altă metodă de potrivire a predicatului specificat, de ex. allMatch() . Diferența dintre allMatch() și anyMatch() este că returnează anyMatch(). Adevărat dacă oricare dintre elementele dintr-un flux se potrivește cu predicatul specificat. Când folosiți allMatch(), toate elementele trebuie să se potrivească cu predicatul dat.

Prin urmare, metoda anyMatch() poate fi folosită în anumite cazuri când dorim să verificăm dacă există cel puțin un element în flux. Metoda contains() a clasei List efectuează, de asemenea, aceeași operație. Deci, putem folosi și metoda contains() în locul metodei anyMatch().

Prin urmare, nu există nicio diferență între metoda List.contains() și Stream.anyMatch().