U Javi 8, anyMatch() je metoda definirana u Stream sučelju. Izvodi a rad terminala kratkog spoja. U ovom odjeljku raspravljat ćemo o anyMatch() metoda u Javi 8 Stream s primjerom. Prije nego prijeđemo na stvar, najprije ćemo detaljno razumjeti srednje i terminalne operacije.
U Javi 8 stream, stream operacije su podijeljene na srednji (poput Stream.filter, Stream.map) i terminal (poput Stream.forEach, Steam.reduce) operacija. Da bismo dobili željene rezultate, moramo kombinirati ove operacije koje tvore cjevovode toka.
Srednje operacije
Međuoperacije su po prirodi lijene (znači, ne izvode stvarnu operaciju, umjesto toga vraćaju novi tok). To znači zadržavanje elemenata početnog toka i uvijek vraćanje novog toka početnog toka. Imajte na umu da izvođenje cjevovoda ne počinje dok se ne izvrši završna operacija cjevovoda.
Međuoperacije se dalje dijele na bez državljanstva operacije (poput filtera i karte) i državnički operacije (poput različitih i sortiranih).
Operacija bez stanja
Operacije bez stanja ne zadržavaju stanje iz prethodno viđenih elemenata tijekom obrade novog elementa. Svaki element se može obraditi neovisno o operacijama na drugim elementima.
Stateful Operation
Operacije praćenja stanja zadržavaju stanje prethodno viđenih elemenata dok obrađuju nove elemente. Svojstvo operacije sa statusom je da obrađuje cijeli ulaz prije nego proizvede rezultat.
Pretpostavimo da izvodimo operaciju sortiranja nad tokom i želimo proizvesti rezultat iz tog toka bez da vidimo sve elemente toka, što nije moguće. Stoga, dok se ne vide svi elementi toka, ne može se proizvesti rezultat. Stoga moramo obraditi cijeli ulaz prije nego proizvedemo rezultat.
Operacija terminala
Operacije terminala prolaze kroz tok kako bi proizvele rezultat ili nuspojavu. Čim se operacija terminala izvrši, cjevovod toka se smatra potrošenim. Nakon konzumiranja više se ne može koristiti. U slučaju da zahtijevamo prolazak kroz isti izvor podataka (tok), vratite tok da biste dobili novi tok.
Gotovo sve operacije terminala su željne prirode. To znači da prelaze potok i obrađuju cjevovod prije povratka. Imajte na umu da to nije dopušteno u operacijama s dva terminala, tj. iterator() i spliterator().
java podniz
Osim gore navedenih operacija, postoji još jedna operacija poznata kao kratkog spoja operacija. I međupostupci i terminali mogu izazvati kratki spoj.
An međuoperacija dolazi do kratkog spoja ako postoji tok s beskonačnim unosom. Kao rezultat može proizvesti konačan tok.
SAD koliko gradova
A rad terminala dolazi do kratkog spoja ako postoji tok s beskonačnim unosom. Može završiti u određenom vremenu.
Primjećujemo da je korištenje operacije kratkog spoja u cjevovodu bitno, ali ne i dovoljno. Postoji uvjet za obradu beskonačnog toka koji je normalno prekinuti rad u konačnom vremenu.
Java 8 Stream.anyMatch()
Vraća odgovara li bilo koji element ovog toka navedenom predikatu. Možda neće procijeniti predikat na svim elementima ako to nije potrebno za određivanje rezultata.
Sintaksa:
boolean anyMatch(Predicate predicate)
Parametri: Prihvaća a nemiješanje i bez državljanstva predikat koji treba primijeniti na elemente ulaznog toka.
Povratak: Vraća se pravi ako bilo koji element odgovara navedenom predikatu, else vraća false. Vraća false ako je tok prazan. U slučaju praznog toka, predikat se ne procjenjuje.
Primjer 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); } }
Izlaz:
true
Sljedeći primjer prikazuje prazan tok koji uvijek vraća false.
AnyMatchExample2.java
jsp
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); } }
Izlaz:
false
Pogledajmo još jedan Java program u kojem smo raščlanili više predikata.
Da biste zadovoljili više uvjeta, stvorite složeni predikat s dva ili više jednostavnih predikata. U navedenom primjeru imamo popis zaposlenika. Želimo provjeriti postoji li zaposlenik koji ima 28 godina i ime počinje slovom R. Sljedeći Java program prikazuje isto.
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>
Izlaz:
true true false
Stream sučelje pruža drugu metodu za podudaranje navedenog predikata, tj. allMatch() . Razlika između allMatch() i anyMatch() je u tome što anyMatch() vraća pravi ako bilo koji od elemenata u toku odgovara navedenom predikatu. Kada koristite allMatch(), svi elementi moraju odgovarati danom predikatu.
Stoga se metoda anyMatch() može koristiti u određenim slučajevima kada želimo provjeriti postoji li barem jedan element u streamu. Metoda contains() klase List također izvodi istu operaciju. Dakle, također možemo koristiti metodu contains() umjesto metode anyMatch().
Dakle, nema razlike između metoda List.contains() i Stream.anyMatch().