logo

anyMatch() v Javě 8

V Javě 8 je anyMatch() metoda definovaná v rozhraní Stream. Provádí a provoz zkratovací svorky. V této části budeme diskutovat o metoda anyMatch() v Java 8 Stream s příkladem. Než přejdeme k věci, nejprve podrobně porozumíme mezioperačním a koncovým operacím.

V proudu Java 8 jsou operace streamu rozděleny na středně pokročilí (jako Stream.filter, Stream.map) a terminál (jako Stream.forEach, Steam.reduce) operace. Abychom dosáhli požadovaných výsledků, musíme tyto operace zkombinovat, které tvoří proudová potrubí.

Mezilehlé operace

Mezilehlé operace jsou líné (to znamená, že neprovedou skutečnou operaci, místo toho vrátí nový proud). Znamená to zachovat prvky původního proudu a vždy vrátit nový proud původního proudu. Všimněte si, že provádění potrubí nezačne, dokud není proveden terminálový provoz potrubí.

Mezioperace se dále dělí na bez státní příslušnosti operace (jako filtr a mapa) a stavový operace (jako odlišné a tříděné).

Java vs C++

Bezstavová operace

Bezstavové operace si při zpracování nového prvku nezachovají stav z dříve viděných prvků. Každý prvek lze zpracovat nezávisle na operacích s jinými prvky.

Stavový provoz

Stavové operace zachovávají stav dříve viděných prvků při zpracování nových prvků. Vlastností stavové operace je, že zpracuje celý vstup před vytvořením výsledku.

Předpokládejme, že provádíme operaci řazení přes proud a chceme z tohoto proudu vytvořit výsledek, aniž bychom viděli všechny prvky proudu, což není možné. Dokud tedy člověk nevidí všechny prvky proudu, nemůže vytvořit výsledek. Před vytvořením výsledku tedy musíme zpracovat celý vstup.

Provoz terminálu

Terminálové operace procházejí proudem a vytvářejí výsledek nebo vedlejší efekt. Jakmile je provedena operace terminálu, považuje se proudové potrubí za spotřebované. Po konzumaci již nelze použít. V případě, že požadujeme procházet stejný zdroj dat (stream), vraťte stream a získáte nový stream.

Téměř všechny terminálové operace jsou horlivé povahy. To znamená, že projdou proudem a zpracují potrubí, než se vrátí. Všimněte si, že to není povoleno v operacích se dvěma terminály, tj. iterator() a spliterator().

Kromě výše uvedených operací existuje další operace známá jako zkratování úkon. Mezilehlé i koncové operace mohou zkratovat.

An střední provoz je zkratový, pokud existuje proud s nekonečným vstupem. Výsledkem může být konečný proud.

A terminálový provoz je zkratový, pokud existuje proud s nekonečným vstupem. Může skončit v konečném čase.

Všimli jsme si, že použití zkratovací operace v potrubí je nezbytné, ale ne dostatečné. Existuje podmínka pro zpracování nekonečného proudu, který je ukončit provoz normálně v konečném čase.

Java 8 Stream.anyMatch()

Vrací, zda některé prvky tohoto proudu odpovídají zadanému predikátu. Nemusí vyhodnotit predikát na všech prvcích, pokud to není nutné pro určení výsledku.

Syntax:

 boolean anyMatch(Predicate predicate) 

Parametry: Přijímá a nezasahující a bez státní příslušnosti predikát, který má být aplikován na prvky vstupního toku.

Vrácení: Vrací se skutečný pokud jakýkoli prvek odpovídá zadanému predikátu, vrátí hodnotu false. Vrátí false, pokud je stream prázdný. V případě prázdného proudu se predikát nevyhodnocuje.

Příklad 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); } } 

Výstup:

pole řetězců c
 true 

Následující příklad ukazuje, že prázdný datový proud vždy vrátí hodnotu 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); } } 

Výstup:

 false 

Podívejme se na další Java program, ve kterém jsme analyzovali více predikátů.

Chcete-li splnit více podmínek, vytvořte složený predikát se dvěma nebo více jednoduchými predikáty. V uvedeném příkladu máme seznam Zaměstnanců. Chceme zkontrolovat, zda existuje zaměstnanec, kterému je 28 let a jméno začíná na abecedu R. Následující Java program zobrazuje totéž.

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>

Výstup:

 true true false 

Rozhraní Stream poskytuje další metodu pro shodu zadaného predikátu, tj. allMatch() . Rozdíl mezi allMatch() a anyMatch() je ten, že anyMatch() vrací skutečný pokud některý z prvků v proudu odpovídá zadanému predikátu. Při použití allMatch() musí všechny prvky odpovídat danému predikátu.

Metodu anyMatch() lze tedy použít v určitém případě, kdy chceme zkontrolovat, zda je v proudu alespoň jeden prvek. Metoda obsahuje() třídy List také provádí stejnou operaci. Můžeme tedy také použít metodu obsahuje() místo metody anyMatch().

Mezi metodou List.contains() a Stream.anyMatch() tedy není žádný rozdíl.