В Java 8 anyMatch() е метод, дефиниран в интерфейса Stream. Извършва а работа на късо съединение. В този раздел ще обсъдим метод anyMatch() в Java 8 Stream с пример. Преди да преминем към точката, първо ще разберем подробно междинните и крайните операции.
В потока на Java 8 операциите на потока са разделени на междинен (като Stream.filter, Stream.map) и терминал (като Stream.forEach, Steam.reduce) операции. За да получим желаните резултати, трябва да комбинираме тези операции, които образуват тръбопроводи на потоци.
Междинни операции
Междинните операции са мързеливи (означава, че не изпълнява действителната операция, вместо това връща нов поток) по природа. Това означава запазване на елементите на първоначалния поток и винаги връщане на нов поток от първоначалния поток. Обърнете внимание, че изпълнението на тръбопровода не започва, докато не бъде изпълнена крайната операция на тръбопровода.
Междинните операции се разделят още на без гражданство операции (като филтър и карта) и състояние операции (като различни и сортирани).
Операция без състояние
Операциите без състояние не запазват състоянието от предишни елементи, докато обработват нов елемент. Всеки елемент може да се обработва независимо от операциите върху други елементи.
формат на java низ
Операция със състояние
Операциите със състояние запазват състоянието от предишни виждани елементи, докато обработват новите елементи. Свойството на операцията със състояние е, че тя обработва целия вход, преди да произведе резултат.
Да предположим, че извършваме операцията по сортиране на потока и искаме да произведем резултата от този поток, без да виждаме всички елементи на потока, което не е възможно. Следователно, докато човек не види всички елементи на потока, не може да произведе резултата. Следователно трябва да обработим целия вход, преди да произведем резултата.
Операция на терминала
Терминалните операции преминават през потока, за да произведат резултат или страничен ефект. Веднага след като операцията на терминала бъде изпълнена, тръбопроводът на потока се счита за използван. След консумация не може да се използва повече. В случай, че изискваме да преминем през същия източник на данни (поток), върнете потока, за да получите нов поток.
Почти всички операции на терминала са нетърпеливи по природа. Това означава, че те преминават през потока и обработват тръбопровода, преди да се върнат. Обърнете внимание, че не е разрешено в операции с два терминала, т.е. iterator() и spliterator().
Освен горните операции, има още една операция, известна като късо съединение операция. Както междинните, така и крайните операции могат да причинят късо съединение.
как да получите достъп до снимки в icloud
Ан междинна операция е късо съединение, ако има поток с безкраен вход. В резултат на това може да се получи краен поток.
А терминална работа е късо съединение, ако има поток с безкраен вход. Може да приключи след определено време.
Забелязваме, че използването на операция на късо съединение в тръбопровода е от съществено значение, но не е достатъчно. Има условие за обработка на безкраен поток, който е нормално прекратяване на работата за крайно време.
Java 8 Stream.anyMatch()
Връща дали някои елементи от този поток съответстват на предоставения предикат. Може да не оцени предиката за всички елементи, ако не е необходимо за определяне на резултата.
какво е кошер
Синтаксис:
boolean anyMatch(Predicate predicate)
Параметри: Приема а непречещи и без гражданство предикат, който трябва да се приложи към елементи от входния поток.
Се завръща: Връща се вярно ако някой елемент съвпада с посочения предикат, 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, в която сме анализирали множество предикати.
"какво е 10 от 100"
За да удовлетворите множество условия, създайте съставен предикат с два или повече прости предиката. В дадения пример имаме списък със служители. Искаме да проверим дали има служител, чиято възраст е 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, 'Andrew')); list.add(new Employee(23, 28, 'Robert')); list.add(new Employee(32, 29, 'Jack')); list.add(new Employee(12, 31, 'Steve')); list.add(new Employee(15, 27, 'Tom')); list.add(new Employee(19, 29, 'Albert')); return list; } } //driver code public class AnyMatchExample { public static void main(String args[]) { //defining predicates Predicate p1 = e -> e.empName.startsWith('S'); Predicate p2 = e -> e.empAge <28 && e.empname.startswith('r'); predicate p3="e" -> e.empName.startsWith('P'); 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
Интерфейсът Stream предоставя друг метод за съвпадение на посочения предикат, т.е. allMatch() . Разликата между allMatch() и anyMatch() е, че anyMatch() връща вярно ако някой от елементите в поток съвпада с посочения предикат. Когато използвате allMatch(), всички елементи трябва да съответстват на дадения предикат.
Следователно методът anyMatch() може да се използва в определени случаи, когато искаме да проверим дали има поне един елемент в потока. Методът contains() на класа List също изпълнява същата операция. Така че можем също да използваме метода contains() вместо метода anyMatch().
Следователно няма разлика между метода List.contains() и Stream.anyMatch().