logo

anyMatch() dans Java 8

Dans Java 8, anyMatch() est une méthode définie dans l'interface Stream. Il effectue un fonctionnement des bornes en court-circuit. Dans cette section, nous aborderons les Méthode anyMatch() dans Java 8 Stream avec un exemple. Avant d’entrer dans le vif du sujet, nous comprendrons d’abord en détail les opérations intermédiaires et terminales.

Dans le flux Java 8, les opérations de flux sont divisées en intermédiaire (comme Stream.filter, Stream.map) et Terminal (comme Stream.forEach, Steam.reduce). Pour obtenir les résultats souhaités, nous devons combiner ces opérations qui forment des pipelines de flux.

collections Java

Opérations intermédiaires

Les opérations intermédiaires sont de nature paresseuse (c'est-à-dire qu'elles n'effectuent pas l'opération réelle, mais renvoient un nouveau flux). Cela signifie conserver les éléments du flux initial et toujours renvoyer un nouveau flux du flux initial. Notez que l’exécution du pipeline ne commence pas tant que l’opération terminale du pipeline n’est pas exécutée.

Les opérations intermédiaires sont divisées en apatride opérations (comme le filtre et la carte) et avec état opérations (comme distinctes et triées).

Opération apatride

Les opérations sans état ne conservent pas l'état des éléments vus précédemment lors du traitement d'un nouvel élément. Chaque élément peut être traité indépendamment des opérations sur les autres éléments.

Opération avec état

Les opérations avec état conservent l'état des éléments précédemment vus tout en traitant les nouveaux éléments. La propriété de l’opération avec état est qu’elle traite l’intégralité de l’entrée avant de produire un résultat.

Supposons que nous effectuions l'opération de tri sur le flux et que nous souhaitions produire le résultat à partir de ce flux sans voir tous les éléments du flux, ce qui n'est pas possible. Par conséquent, tant qu’on ne voit pas tous les éléments du flux, on ne peut pas produire le résultat. Par conséquent, nous devons traiter l’intégralité de l’entrée avant de produire le résultat.

Fonctionnement du terminal

Les opérations du terminal parcourent le flux pour produire un résultat ou un effet secondaire. Dès que l'opération du terminal est exécutée, le pipeline de flux est considéré comme consommé. Après consommation, il ne peut plus être utilisé. Dans le cas où nous avons besoin de parcourir la même source de données (flux), renvoyez le flux pour obtenir un nouveau flux.

Presque toutes les opérations du terminal sont de nature impatiente. Cela signifie qu'ils traversent le flux et traitent le pipeline avant de revenir. Notez que cela n'est pas autorisé dans les opérations à deux terminaux, c'est-à-dire iterator() et spliterator().

Outre les opérations ci-dessus, il existe une autre opération appelée court-circuit opération. Les opérations intermédiaires et terminales peuvent provoquer un court-circuit.

Un opération intermédiaire est en court-circuit s'il existe un flux avec une entrée infinie. En conséquence, cela peut produire un flux fini.

UN fonctionnement du terminal est en court-circuit s'il existe un flux avec une entrée infinie. Cela peut se terminer dans un temps limité.

On constate que recourir à une opération de court-circuit dans la canalisation est indispensable mais pas suffisant. Il existe une condition pour traiter un flux infini qui est terminer l'opération normalement dans un temps fini.

es5 contre es6

Java 8 Stream.anyMatch()

Il indique si des éléments de ce flux correspondent au prédicat fourni. Il ne peut pas évaluer le prédicat sur tous les éléments si cela n'est pas nécessaire pour déterminer le résultat.

Syntaxe:

 boolean anyMatch(Predicate predicate) 

Paramètres: Il accepte un non-interférant et apatride prédicat qui doit être appliqué aux éléments du flux d’entrée.

Retour: Il revient vrai si un élément correspond au prédicat spécifié, sinon renvoie false. Renvoie false si le flux est vide. Dans le cas d'un flux vide, le prédicat n'est pas évalué.

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

Sortir:

 true 

L'exemple suivant illustre un flux vide qui renvoie toujours false.

AnyMatchExample2.java

dactylographié pour chaque
 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); } } 

Sortir:

 false 

Voyons un autre programme Java dans lequel nous avons analysé plusieurs prédicats.

amrita rao acteur

Pour satisfaire plusieurs conditions, créez un prédicat composé avec deux ou plusieurs prédicats simples. Dans l'exemple donné, nous avons une liste d'employés. Nous voulons vérifier s’il existe un employé âgé de 28 ans et dont le nom commence par l’alphabet R. Le programme Java suivant décrit la même chose.

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>

Sortir:

 true true false 

L'interface Stream fournit une autre méthode pour faire correspondre le prédicat spécifié, c'est-à-dire allMatch() . La différence entre allMatch() et anyMatch() est que anyMatch() renvoie vrai si l'un des éléments d'un flux correspond au prédicat spécifié. Lors de l'utilisation de allMatch(), tous les éléments doivent correspondre au prédicat donné.

Par conséquent, la méthode anyMatch() peut être utilisée dans certains cas où nous voulons vérifier s’il y a au moins un élément dans le flux. La méthode contain() de la classe List effectue également la même opération. Ainsi, nous pouvons également utiliser la méthode contain() à la place de la méthode anyMatch().

Par conséquent, il n’y a aucune différence entre les méthodes List.contains() et Stream.anyMatch().