logo

anyMatch() у Java 8

У Java 8 anyMatch() — це метод, визначений в інтерфейсі Stream. Він виконує a коротке замикання терміналу. У цьому розділі ми обговоримо метод anyMatch() у Java 8 Stream з прикладом. Перш ніж перейти до суті, спочатку ми детально розберемося з проміжними та кінцевими операціями.

У Java 8 потокові операції поділяються на проміжний (наприклад, Stream.filter, Stream.map) і термінал (наприклад, Stream.forEach, Steam.reduce). Щоб отримати бажані результати, нам потрібно поєднати ці операції, які формують потокові конвеєри.

Проміжні операції

Проміжні операції є ледачими (тобто не виконують фактичну операцію, замість цього повертають новий потік) за своєю природою. Це означає збереження елементів початкового потоку та завжди повернення нового потоку початкового потоку. Зверніть увагу, що виконання конвеєра не починається, доки не буде виконано кінцеву операцію конвеєра.

Проміжні операції ще поділяються на особи без громадянства операції (наприклад, фільтр і карта) і державний операції (наприклад, різні та відсортовані).

Операція без стану

Операції без стану не зберігають стан із раніше побачених елементів під час обробки нового елемента. Кожен елемент можна обробляти незалежно від операцій над іншими елементами.

java підручник

Операція із збереженням стану

Операції зі збереженням стану зберігають стан раніше видимих ​​елементів під час обробки нових елементів. Властивість операції зі збереженням стану полягає в тому, що вона обробляє весь вхідний сигнал перед отриманням результату.

Припустімо, ми виконуємо операцію сортування над потоком і хочемо отримати результат із цього потоку, не бачачи всіх елементів потоку, що неможливо. Тому, доки не побачиш усі елементи потоку, неможливо отримати результат. Отже, нам потрібно обробити весь вхід, перш ніж отримати результат.

Операція терміналу

Термінальні операції перетинають потік, щоб отримати результат або побічний ефект. Як тільки термінальна операція виконується, конвеєр потоку вважається використаним. Після вживання його більше не можна використовувати. У випадку, якщо нам потрібно пройти те саме джерело даних (потік), поверніть потік, щоб отримати новий потік.

Майже всі термінальні операції є нетерплячими. Це означає, що вони перетинають потік і обробляють трубопровід перед поверненням. Зауважте, що це не дозволено в операціях із двома терміналами, наприклад iterator() і spliterator().

Крім перерахованих вище операцій, існує ще одна операція, відома як коротке замикання операція. Як проміжні, так і кінцеві операції можуть замикатися.

лінійний пошук в java

Ан проміжна операція є коротким замиканням, якщо є потік із нескінченним входом. У результаті він може створити кінцевий потік.

А термінальна робота є коротким замиканням, якщо є потік із нескінченним входом. Він може закінчитися через кінцевий час.

Ми зауважуємо, що використання операції короткого замикання в трубопроводі є важливим, але недостатнім. Існує умова обробки нескінченного потоку припинити роботу зазвичай за кінцевий час.

Java 8 Stream.anyMatch()

Він повертає, чи відповідають будь-які елементи цього потоку наданому предикату. Він може не оцінювати предикат для всіх елементів, якщо це не потрібно для визначення результату.

зв'язаний список java

Синтаксис:

 boolean anyMatch(Predicate predicate) 

Параметри: Він приймає a невтручання і особи без громадянства предикат, який буде застосовано до елементів вхідного потоку.

Повернення: Воно повертається правда якщо будь-який елемент відповідає вказаному предикату, else повертає false. Повертає false, якщо потік порожній. У випадку порожнього потоку предикат не обчислюється.

Приклад 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); } } 

Вихід:

 true 

У наступному прикладі показано, що порожній потік завжди повертає 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); } } 

Вихід:

 false 

Давайте подивимося на іншу програму Java, у якій ми розібрали кілька предикатів.

символ екранування java

Щоб задовольнити кілька умов, створіть складений предикат із двома або більше простими предикатами. У наведеному прикладі ми маємо список співробітників. Ми хочемо перевірити, чи є працівник віком 28 років, ім’я якого починається з літери R. Наступна програма на Java зображує те саме.

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>

Вихід:

 true true false 

Інтерфейс потоку надає інший метод для відповідності зазначеному предикату, тобто. allMatch() . Різниця між allMatch() і anyMatch() полягає в тому, що anyMatch() повертає правда якщо будь-який з елементів у потоці відповідає зазначеному предикату. При використанні allMatch() усі елементи мають відповідати даному предикату.

Тому метод anyMatch() можна використовувати в певному випадку, коли ми хочемо перевірити, чи є хоча б один елемент у потоці. Метод contains() класу List також виконує ту саму операцію. Отже, ми також можемо використовувати метод contains() замість методу anyMatch().

Отже, немає різниці між методами List.contains() і Stream.anyMatch().