A Java 8-ban az anyMatch() a Stream felületen definiált metódus. Végrehajtja a zárlatos terminál működése. Ebben a részben a anyMatch() metódus a Java 8 Streamben egy példával. Mielőtt a lényegre térnénk, először is részletesen megértjük a közbenső és a terminális műveleteket.
A Java 8 adatfolyamban a stream műveletek fel vannak osztva közbülső (például Stream.filter, Stream.map) és terminál (például Stream.forEach, Steam.reduce) műveletek. A kívánt eredmények eléréséhez ezeket a műveleteket kombinálnunk kell, amelyek folyami csővezetékeket alkotnak.
Köztes műveletek
A köztes műveletek lusták (azaz nem hajtják végre a tényleges műveletet, hanem egy új folyamot adnak vissza). Ez azt jelenti, hogy megtartjuk a kezdeti adatfolyam elemeit, és mindig a kezdeti adatfolyam új folyamát adjuk vissza. Vegye figyelembe, hogy a csővezeték végrehajtása csak akkor kezdődik el, amikor a csővezeték végműveletét végre nem hajtják.
A köztes műveletek tovább oszlanak hontalan műveletek (például szűrő és térkép) és állapottartó műveletek (például megkülönböztetés és rendezés).
Állam nélküli művelet
Az állapot nélküli műveletek egy új elem feldolgozása során nem tartják meg a korábban látott elemek állapotát. Minden elem a többi elemen végzett műveletektől függetlenül feldolgozható.
Állapottartó működés
Az állapottartó műveletek megőrzik a korábban látott elemek állapotát, miközben feldolgozzák az új elemeket. Az állapottartó művelet tulajdonsága, hogy a teljes bemenetet feldolgozza, mielőtt eredményt adna.
Tegyük fel, hogy az adatfolyamon keresztül hajtjuk végre a rendezési műveletet, és ebből az adatfolyamból akarjuk előállítani az eredményt anélkül, hogy látnánk az adatfolyam összes elemét, ami nem lehetséges. Ezért amíg valaki nem látja a folyam összes elemét, addig nem produkálhatja az eredményt. Ezért az eredmény létrehozása előtt a teljes bemenetet fel kell dolgoznunk.
Terminál működése
A terminálműveletek áthaladnak a folyamon, hogy eredményt vagy mellékhatást hozzanak létre. Amint a terminálművelet végrehajtásra kerül, az adatfolyam-csővezeték elhasználtnak minősül. Elfogyasztás után már nem használható. Abban az esetben, ha ugyanazt az adatforrást (folyamot) kell bejárnunk, adja vissza az adatfolyamot, hogy új adatfolyamot kapjon.
Szinte minden terminálművelet mohó jellegű. Ez azt jelenti, hogy áthaladnak a patakon, és feldolgozzák a csővezetéket, mielőtt visszatérnének. Vegye figyelembe, hogy ez nem megengedett kétterminális műveletekben, azaz az iterator() és a spliterator() műveletekben.
A fenti műveletek mellett van egy másik művelet is rövidzárlat művelet. Mind a közbenső, mind a terminálműveletek rövidzárlatot okozhatnak.
An köztes működés rövidre zár, ha van egy végtelen bemenetű adatfolyam. Ennek eredményeként véges folyamot produkálhat.
A terminál működése rövidre zár, ha van egy végtelen bemenetű adatfolyam. Véges időn belül megszűnhet.
Megfigyeljük, hogy a csővezetékben a rövidzárlati művelet alkalmazása elengedhetetlen, de nem elegendő. Egy végtelen adatfolyam feldolgozásának feltétele van véges időn belül normál módon leállítja a működést.
Java 8 Stream.anyMatch()
Visszaadja, hogy ennek az adatfolyamnak valamelyik eleme egyezik-e a megadott predikátummal. Előfordulhat, hogy nem értékeli ki az összes elemre vonatkozó predikátumot, ha nem szükséges az eredmény meghatározásához.
Szintaxis:
boolean anyMatch(Predicate predicate)
Paraméterek: Elfogadja a nem zavaró és hontalan predikátum, amelyet a bemeneti adatfolyam elemeire kell alkalmazni.
Visszaküldés: Visszatér igaz ha bármely elem egyezik a megadott predikátummal, az egyébként false értéket ad vissza. Hamis értéket ad vissza, ha az adatfolyam üres. Üres adatfolyam esetén a predikátum nem kerül kiértékelésre.
Java anyMatch() példa
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); } }
Kimenet:
"bankár algoritmusa"
true
A következő példa egy üres adatfolyamot mindig false értékkel tér vissza.
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); } }
Kimenet:
false
Lássunk egy másik Java programot, amelyben több predikátumot elemeztünk.
Több feltétel teljesítéséhez hozzon létre egy összetett predikátumot két vagy több egyszerű predikátummal. Az adott példában az alkalmazottak listáját láthatjuk. Szeretnénk ellenőrizni, hogy van-e olyan alkalmazott, aki 28 éves, és a neve R ábécével kezdődik. A következő Java program ugyanezt ábrázolja.
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>
Kimenet:
true true false
A Stream interfész egy másik módszert biztosít a megadott predikátum egyeztetésére, pl. allMatch() . Az allMatch() és az anyMatch() közötti különbség az, hogy az anyMatch() visszatér igaz ha egy adatfolyamban bármelyik elem egyezik a megadott predikátummal. Az allMatch() használatakor minden elemnek meg kell egyeznie az adott predikátummal.
Ezért az anyMatch() metódus használható abban az esetben, amikor ellenőrizni akarjuk, hogy van-e legalább egy elem a folyamban. A List osztály include() metódusa is ugyanezt a műveletet hajtja végre. Tehát az anyMatch() metódus helyett használhatjuk a include() metódust is.
Ezért nincs különbség a List.contains() és a Stream.anyMatch() metódus között.