V Javi 8 je anyMatch() metoda, definirana v vmesniku Stream. Izvaja a delovanje terminala s kratkim stikom. V tem razdelku bomo razpravljali o metodo anyMatch() v Java 8 Stream s primerom. Preden preidemo k bistvu, bomo najprej podrobno razumeli vmesne in končne operacije.
V toku Java 8 so operacije toka razdeljene na vmesni (kot Stream.filter, Stream.map) in terminal (kot so Stream.forEach, Steam.reduce). Da bi dobili želene rezultate, moramo združiti te operacije, ki tvorijo tokovne cevovode.
Vmesne operacije
Vmesne operacije so po naravi lene (kar pomeni, da ne izvedejo dejanske operacije, temveč vrnejo nov tok). To pomeni ohraniti elemente začetnega toka in vedno vrniti nov tok začetnega toka. Upoštevajte, da se izvajanje cevovoda ne začne, dokler se ne izvede končna operacija cevovoda.
Vmesne operacije delimo še na brez državljanstva operacije (kot sta filter in zemljevid) in stanje operacije (kot sta ločeno in razvrščeno).
Operacija brez stanja
Operacije brez stanja ne ohranijo stanja predhodno videnih elementov med obdelavo novega elementa. Vsak element je mogoče obdelati neodvisno od operacij na drugih elementih.
Stateful Operation
Operacije stanja ohranjajo stanje prej videnih elementov med obdelavo novih elementov. Lastnost operacije s stanjem je, da obdela celoten vnos, preden ustvari rezultat.
Recimo, da izvajamo operacijo razvrščanja nad tokom in želimo ustvariti rezultat iz tega toka, ne da bi videli vse elemente toka, kar ni mogoče. Torej, dokler ne vidite vseh elementov toka, ne morete ustvariti rezultata. Zato moramo obdelati celoten vnos, preden ustvarimo rezultat.
nastavitve internetnega brskalnika
Delovanje terminala
Operacije terminala prečkajo tok, da ustvarijo rezultat ali stranski učinek. Takoj, ko se operacija terminala izvede, se šteje, da je cevovod toka porabljen. Po porabi ni več uporabna. V primeru, da zahtevamo prečkanje istega vira podatkov (toka), vrnite tok, da dobite nov tok.
Skoraj vse terminalske operacije so željne narave. To pomeni, da prečkajo tok in obdelajo cevovod, preden se vrnejo. Upoštevajte, da ni dovoljeno v operacijah z dvema terminaloma, tj. iterator() in spliterator().
Poleg zgornjih operacij obstaja še ena operacija, znana kot kratkega stika delovanje. Kratek stik lahko povzročijo tako vmesne kot končne operacije.
An vmesno delovanje je kratek stik, če obstaja tok z neskončnim vnosom. Posledično lahko ustvari končen tok.
A delovanje terminala je kratek stik, če obstaja tok z neskončnim vnosom. Lahko se konča v določenem času.
Opažamo, da je uporaba kratkega stika v cevovodu bistvena, vendar ne zadostna. Obstaja pogoj za obdelavo neskončnega toka, ki je običajno prekine delovanje v končnem času.
Java 8 Stream.anyMatch()
Vrne, ali se kateri koli element tega toka ujema s podanim predikatom. Morda ne bo ocenil predikata za vse elemente, če to ni potrebno za določitev rezultata.
numpy edinstven
Sintaksa:
boolean anyMatch(Predicate predicate)
Parametri: Sprejema a nevmešavanje in brez državljanstva predikat, ki ga je treba uporabiti za elemente vhodnega toka.
Vrne: Vrača se prav če se kateri koli element ujema s podanim predikatom, else vrne false. Vrne false, če je tok prazen. V primeru praznega toka predikat ni ovrednoten.
Primer 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); } }
Izhod:
true
Naslednji primer prikazuje, da prazen tok vedno vrne false.
AnyMatchExample2.java
kaj je panj
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); } }
Izhod:
false
Oglejmo si še en program Java, v katerem smo razčlenili več predikatov.
Če želite izpolniti več pogojev, ustvarite sestavljen predikat z dvema ali več preprostimi predikati. V danem primeru imamo seznam zaposlenih. Želimo preveriti, ali obstaja zaposleni, katerega starost je 28 in se ime začne s črko R. Naslednji program Java 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>
Izhod:
true true false
Vmesnik Stream ponuja drugo metodo za ujemanje podanega predikata, tj. allMatch() . Razlika med allMatch() in anyMatch() je v tem, da anyMatch() vrne prav če se kateri od elementov v toku ujema s podanim predikatom. Pri uporabi allMatch() se morajo vsi elementi ujemati z danim predikatom.
Zato lahko metodo anyMatch() uporabimo v določenem primeru, ko želimo preveriti, ali je v toku vsaj en element. Enako operacijo izvaja tudi metoda contains() razreda List. Torej lahko uporabimo tudi metodo contains() namesto metode anyMatch().
Zato ni razlike med metodo List.contains() in Stream.anyMatch().