logo

anyMatch() i Java 8

I Java 8 är anyMatch() en metod som definieras i Stream-gränssnittet. Den utför en kortslutningsterminaldrift. I det här avsnittet kommer vi att diskutera anyMatch()-metoden i Java 8 Stream med ett exempel. Innan vi går till punkten kommer vi först att förstå de mellanliggande och terminaloperationerna i detalj.

I Java 8 stream är strömningsoperationerna indelade i mellanliggande (som Stream.filter, Stream.map) och terminal (som Stream.forEach, Steam.reduce) operationer. För att få önskat resultat måste vi kombinera dessa operationer som bildar strömrörledningar.

Mellanliggande verksamhet

Mellanoperationer är lata (betyder, utför inte själva operationen, istället returnerar en ny ström) i naturen. Det betyder att behålla elementen i den initiala strömmen och alltid returnera en ny ström av den initiala strömmen. Observera att exekveringen av pipelinen inte börjar förrän pipelinens terminaloperation har exekveras.

Mellanliggande verksamheter delas vidare in i statslös operationer (som filter och karta) och ståtlig operationer (som distinkt och sorterad).

Statslös operation

De tillståndslösa operationerna behåller inte tillståndet från tidigare sett element under bearbetning av ett nytt element. Varje element kan bearbetas oberoende av operationer på andra element.

Statlig operation

De statliga operationerna behåller staten från tidigare sedda element medan de bearbetar de nya elementen. Egenskapen för den stateful operationen är att den bearbetar hela input innan den producerar ett resultat.

Antag att vi utför sorteringsoperationen över strömmen och vill producera resultatet från den strömmen utan att se alla element i strömmen, vilket inte är möjligt. Därför, tills man inte ser alla element i strömmen, kan man inte producera resultatet. Därför måste vi bearbeta hela input innan vi producerar resultatet.

Terminaldrift

Terminaloperationer korsar strömmen för att producera ett resultat eller bieffekt. Så snart terminaloperationen har utförts anses strömledningen vara förbrukad. Efter konsumtion kan den inte längre användas. Om vi ​​behöver passera samma datakälla (ström), returnera strömmen för att få en ny ström.

Nästan all terminalverksamhet är ivriga till sin natur. Det betyder att de korsar strömmen och bearbetar rörledningen innan de återvänder. Observera att det inte är tillåtet i tvåterminalsoperationer, dvs iterator() och spliterator().

Förutom ovanstående operationer finns det en annan operation känd som kortslutning drift. Både mellan- och terminaldrift kan kortsluta.

En mellandrift är kortslutning om det finns en ström med oändlig ingång. Det kan producera en ändlig ström som ett resultat.

A terminaldrift är kortslutning om det finns en ström med oändlig ingång. Den kan avslutas inom en begränsad tid.

Vi observerar att användningen av en kortslutningsoperation i rörledningen är väsentlig men inte tillräcklig. Det finns ett villkor för att bearbeta en oändlig ström alltså avsluta driften normalt inom begränsad tid.

Java 8 Stream.anyMatch()

Den returnerar om några element i denna ström matchar det angivna predikatet. Det kanske inte utvärderar predikatet på alla element om det inte är nödvändigt för att bestämma resultatet.

Syntax:

 boolean anyMatch(Predicate predicate) 

Parametrar: Den accepterar en icke störande och statslös predikat som ska tillämpas på element i ingångsströmmen.

Returnerar: Den återkommer Sann om något element matchar det angivna predikatet, returnerar annars false. Returnerar falskt om flödet är tomt. I fallet med en tom ström utvärderas inte predikatet.

Java anyMatch() Exempel

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

Produktion:

fönster.öppna
 true 

Följande exempel visar en tom ström som alltid returnerar false.

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

Produktion:

 false 

Låt oss se ett annat Java-program där vi har analyserat flera predikat.

För att uppfylla flera villkor, skapa ett sammansatt predikat med två eller flera enkla predikat. I det givna exemplet har vi en lista över anställda. Vi vill kolla om det finns en anställd vars ålder är 28 år och namnet börjar med alfabetet R. Följande Java-program visar detsamma.

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>

Produktion:

 true true false 

Stream-gränssnittet tillhandahåller en annan metod för att matcha det specificerade predikatet, dvs. allMatch() . Skillnaden mellan allMatch() och anyMatch() är att anyMatch() returnerar Sann om något av elementen i en ström matchar det angivna predikatet. När du använder allMatch() måste alla element matcha det givna predikatet.

Därför kan anyMatch()-metoden användas i det specifika fallet när vi vill kontrollera om det finns minst ett element i strömmen. Metoden contains() för klassen List utför också samma operation. Så vi kan också använda metoden contains() istället för anyMatch()-metoden.

Därför finns det ingen skillnad mellan metoden List.contains() och Stream.anyMatch().