logo

anyMatch() in Java 8

In Java 8, anyMatch() è un metodo definito nell'interfaccia Stream. Esegue a funzionamento del terminale in cortocircuito. In questa sezione discuteremo di metodo anyMatch() in Java 8 Stream con un esempio. Prima di passare al dunque, comprenderemo nel dettaglio le operazioni intermedie e terminali.

Nel flusso Java 8, le operazioni del flusso sono suddivise in intermedio (come Stream.filter, Stream.map) e terminale (come Stream.forEach, Steam.reduce) operazioni. Per ottenere i risultati desiderati, dobbiamo combinare queste operazioni che formano le pipeline di flusso.

Operazioni intermedie

Le operazioni intermedie sono di natura pigra (significa che non eseguono l'operazione effettiva, restituiscono invece un nuovo flusso). Significa conservare gli elementi del flusso iniziale e restituire sempre un nuovo flusso del flusso iniziale. Si noti che l'esecuzione della pipeline non inizia finché non viene eseguita l'operazione terminale della pipeline.

Le operazioni intermedie sono ulteriormente suddivise in apolide operazioni (come filtro e mappa) e statale operazioni (come distinte e ordinate).

Operazione apolide

Le operazioni senza stato non mantengono lo stato degli elementi visti in precedenza durante l'elaborazione di un nuovo elemento. Ogni elemento può essere elaborato indipendentemente dalle operazioni su altri elementi.

formato stringa Java

Operazione con stato

Le operazioni con stato mantengono lo stato degli elementi visti in precedenza durante l'elaborazione dei nuovi elementi. La proprietà dell'operazione con stato è che elabora l'intero input prima di produrre un risultato.

Supponiamo di eseguire l'operazione di ordinamento sul flusso e di voler produrre il risultato da quel flusso senza vedere tutti gli elementi del flusso, il che non è possibile. Pertanto, finché non si vedono tutti gli elementi del flusso, non è possibile produrre il risultato. Pertanto, dobbiamo elaborare l'intero input prima di produrre il risultato.

Operazione terminale

Le operazioni terminali attraversano il flusso per produrre un risultato o un effetto collaterale. Non appena viene eseguita l'operazione terminale, la pipeline del flusso viene considerata consumata. Dopo il consumo non può più essere utilizzato. Nel caso in cui sia necessario attraversare la stessa origine dati (flusso), restituire il flusso per ottenere un nuovo flusso.

Quasi tutte le operazioni terminalistiche sono di natura desiderosa. Significa che attraversano il flusso ed elaborano la pipeline prima di tornare. Tieni presente che non è consentito nelle operazioni a due terminali, ad esempio iterator() e spliterator().

Oltre alle operazioni di cui sopra, esiste un'altra operazione nota come cortocircuito operazione. Sia le operazioni intermedie che quelle terminali potrebbero andare in cortocircuito.

algoritmo di 'prim''

UN operazione intermedia è in cortocircuito se è presente un flusso con input infinito. Di conseguenza, potrebbe produrre un flusso finito.

UN funzionamento del terminale è in cortocircuito se è presente un flusso con input infinito. Può terminare in un tempo finito.

Osserviamo che ricorrere ad un'operazione di cortocircuito della pipeline è essenziale ma non sufficiente. Esiste una condizione per elaborare un flusso infinito terminare l'operazione normalmente in un tempo finito.

Java 8 Stream.anyMatch()

Restituisce se qualche elemento di questo flusso corrisponde al predicato fornito. Potrebbe non valutare il predicato su tutti gli elementi se non necessari per determinare il risultato.

bash if istruzione

Sintassi:

 boolean anyMatch(Predicate predicate) 

parametri: Accetta a non interferire E apolide predicato che deve essere applicato agli elementi del flusso di input.

Ritorna: Ritorna VERO se qualche elemento corrisponde al predicato specificato, altrimenti restituisce false. Restituisce false, se il flusso è vuoto. Nel caso di un flusso vuoto, il predicato non viene valutato.

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

Produzione:

insieme c++
 true 

L'esempio seguente illustra un flusso vuoto che restituisce sempre 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); } } 

Produzione:

 false 

Vediamo un altro programma Java in cui abbiamo analizzato più predicati.

altezza sfalsata

Per soddisfare più condizioni, creare un predicato composto con due o più predicati semplici. Nell'esempio fornito, abbiamo un elenco di dipendenti. Vogliamo verificare se c'è un dipendente la cui età è 28 e il nome inizia con l'alfabeto R. Il seguente programma Java descrive lo stesso.

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>

Produzione:

 true true false 

L'interfaccia Stream fornisce un altro metodo per far corrispondere il predicato specificato, ad es. tutti gli abbinamenti() . La differenza tra allMatch() e anyMatch() è che anyMatch() restituisce VERO se uno qualsiasi degli elementi in un flusso corrisponde al predicato specificato. Quando si utilizza allMatch(), tutti gli elementi devono corrispondere al predicato specificato.

Pertanto, il metodo anyMatch() può essere utilizzato in determinati casi in cui vogliamo verificare se è presente almeno un elemento nello stream. Anche il metodo contiene() della classe List esegue la stessa operazione. Quindi possiamo anche usare il metodo contiene() al posto del metodo anyMatch().

Pertanto, non vi è alcuna differenza tra il metodo List.contains() e Stream.anyMatch().