logo

anyMatch() in Java 8

In Java 8 is anyMatch() een methode die is gedefinieerd in de Stream-interface. Het voert een kortsluiting terminal bediening. In deze sectie bespreken we de anyMatch()-methode in Java 8 Stream met een voorbeeld. Voordat we ter zake komen, zullen we eerst de tussenliggende en terminale operaties in detail begrijpen.

In Java 8-stream zijn de streambewerkingen onderverdeeld in tussenliggend (zoals Stream.filter, Stream.map) en terminal (zoals Stream.forEach, Steam.reduce) bewerkingen. Om de gewenste resultaten te krijgen, moeten we deze bewerkingen combineren die stroompijpleidingen vormen.

Tussenliggende operaties

Tussenliggende bewerkingen zijn lui (betekent dat ze niet de daadwerkelijke bewerking uitvoeren, maar in plaats daarvan een nieuwe stroom retourneren) van aard. Het betekent dat je de elementen van de initiële stroom behoudt en altijd een nieuwe stroom van de initiële stroom retourneert. Merk op dat de uitvoering van de pijpleiding pas begint als de terminaloperatie van de pijpleiding is uitgevoerd.

Tussenliggende operaties zijn verder onderverdeeld in staatloos bewerkingen (zoals filter en kaart) en statelijk bewerkingen (zoals onderscheiden en gesorteerd).

Staatloze operatie

De staatloze bewerkingen behouden niet de status van eerder geziene elementen tijdens het verwerken van een nieuw element. Elk element kan onafhankelijk van bewerkingen op andere elementen worden verwerkt.

Statelijke operatie

De stateful bewerkingen behouden de status van eerder geziene elementen terwijl de nieuwe elementen worden verwerkt. De eigenschap van de stateful bewerking is dat deze de volledige invoer verwerkt voordat er een resultaat ontstaat.

Stel dat we de sorteerbewerking op de stream uitvoeren en het resultaat van die stream willen produceren zonder alle elementen van de stream te zien, wat niet mogelijk is. Daarom kan men, totdat men niet alle elementen van de stroom ziet, het resultaat niet produceren. Daarom moeten we de volledige invoer verwerken voordat we het resultaat produceren.

Terminalbediening

Terminaloperaties doorkruisen de stroom om een ​​resultaat of neveneffect te produceren. Zodra de terminaloperatie is uitgevoerd, wordt de stroompijplijn als verbruikt beschouwd. Na consumptie kan het niet meer worden gebruikt. Als we dezelfde gegevensbron (stream) moeten doorlopen, retourneert u de stream om een ​​nieuwe stream te krijgen.

Bijna alle terminalactiviteiten zijn gretig van aard. Het betekent dat ze de stroom doorkruisen en de pijpleiding verwerken voordat ze terugkeren. Merk op dat dit niet is toegestaan ​​bij bewerkingen met twee terminals, d.w.z. iterator() en spliterator().

Naast de bovenstaande bewerkingen is er nog een andere bewerking bekend als kortsluiting operatie. Zowel tussenliggende als terminale handelingen kunnen kortsluiting veroorzaken.

Een tussenliggende bediening is kortsluiting als er een stroom is met oneindige invoer. Hierdoor kan een eindige stroom ontstaan.

A terminale bediening is kortsluiting als er een stroom is met oneindige invoer. Het kan binnen een bepaalde tijd eindigen.

Wij constateren dat het toepassen van een kortsluitoperatie in de leiding essentieel maar niet voldoende is. Er is een voorwaarde om een ​​oneindige stroom te verwerken de werking normaal gesproken binnen een beperkte tijd beëindigen.

Java 8 Stream.anyMatch()

Het retourneert of elementen van deze stroom overeenkomen met het opgegeven predikaat. Het is mogelijk dat het predikaat niet op alle elementen wordt beoordeeld als dit niet nodig is voor het bepalen van het resultaat.

Syntaxis:

 boolean anyMatch(Predicate predicate) 

Parameters: Het accepteert een niet-inmengend En staatloos predikaat dat moet worden toegepast op elementen van de invoerstroom.

Geeft terug: Het keert terug WAAR als een element overeenkomt met het opgegeven predikaat, retourneert else false. Retourneert false als de stream leeg is. Bij een lege stream wordt het predikaat niet geëvalueerd.

Java anyMatch() Voorbeeld

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

Uitgang:

Java-verbeterde lus
 true 

In het volgende voorbeeld wordt een lege stream weergegeven die altijd false retourneert.

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

Uitgang:

 false 

Laten we eens naar een ander Java-programma kijken waarin we meerdere predikaten hebben geparseerd.

Om aan meerdere voorwaarden te voldoen, maakt u een samengesteld predikaat met twee of meer eenvoudige predikaten. In het gegeven voorbeeld hebben we een lijst met werknemers. We willen controleren of er een medewerker is die 28 jaar oud is en de naam begint met het alfabet R. Het volgende Java-programma geeft hetzelfde weer.

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>

Uitgang:

 true true false 

De Stream-interface biedt een andere methode voor het matchen van het opgegeven predikaat, d.w.z. allesMatch() . Het verschil tussen allMatch() en anyMatch() is dat anyMatch() retourneert WAAR als een van de elementen in een stream overeenkomt met het opgegeven predikaat. Wanneer u allMatch() gebruikt, moeten alle elementen overeenkomen met het gegeven predikaat.

Daarom kan de methode anyMatch() in bepaalde gevallen worden gebruikt wanneer we willen controleren of er ten minste één element in de stream aanwezig is. De methode bevat() van de klasse List voert dezelfde bewerking uit. We kunnen dus ook de methode contain() gebruiken in plaats van de methode anyMatch().

Er is dus geen verschil tussen de methoden List.contains() en Stream.anyMatch().