Java 8'de anyMatch(), Stream arayüzünde tanımlanan bir yöntemdir. Bir gerçekleştirir kısa devre terminal çalışması. Bu bölümde şunları tartışacağız: Java 8 Akışında anyMatch() yöntemi bir örnekle. Konuya geçmeden önce öncelikle ara ve terminal işlemlerini detaylı olarak anlayacağız.
Java 8 akışında akış işlemleri şu şekilde bölünmüştür: orta seviye (Stream.filter, Stream.map gibi) ve terminal (Stream.forEach, Steam.reduce gibi) işlemleri. İstenilen sonuçları elde etmek için akış boru hatlarını oluşturan bu işlemleri birleştirmemiz gerekir.
Ara İşlemler
Ara işlemler doğası gereği tembeldir (yani asıl işlemi gerçekleştirmez, bunun yerine yeni bir akış döndürür). Bu, ilk akışın öğelerinin korunması ve her zaman ilk akışın yeni bir akışının döndürülmesi anlamına gelir. Boru hattının terminal işlemi yürütülene kadar boru hattının yürütülmesinin başlamadığını unutmayın.
Ara işlemler ayrıca ikiye ayrılır: vatansız işlemler (filtre ve harita gibi) ve durum bilgisi olan işlemler (farklı ve sıralanmış gibi).
Durum Bilgisiz Operasyon
Durum bilgisi olmayan işlemler, yeni bir öğeyi işlerken daha önce görülen öğelerin durumunu korumaz. Her öğe, diğer öğeler üzerindeki işlemlerden bağımsız olarak işlenebilir.
veri yapısında yapı
Durum Bilgili Operasyon
Durum bilgisi olan işlemler, yeni öğeleri işlerken daha önce görülen öğelerin durumunu korur. Durum bilgisi olan operasyonun özelliği, bir sonuç üretmeden önce girdinin tamamını işlemesidir.
Diyelim ki akış üzerinde sıralama işlemi yapıyoruz ve akışın tüm elemanlarını görmeden o akıştan sonuç üretmek istiyoruz ki bu mümkün değildir. Dolayısıyla akışın tüm unsurlarını görmedikçe sonuç üretilemez. Bu nedenle sonucu üretmeden önce girdinin tamamını işlememiz gerekir.
Terminal Operasyonu
Terminal işlemleri, bir sonuç veya yan etki üretmek için akışın üzerinden geçer. Terminal işlemi yürütülür yürütülmez akış boru hattının tüketildiği kabul edilir. Tüketildikten sonra artık kullanılamaz. Aynı veri kaynağından (akışından) geçmemiz gerektiğinde, yeni bir akış elde etmek için akışı geri döndürmemiz gerekir.
Neredeyse tüm terminal operasyonları doğası gereği isteklidir. Bu, geri dönmeden önce akıntıyı geçip boru hattını işledikleri anlamına geliyor. iterator() ve spliterator() gibi iki terminalli işlemlerde buna izin verilmediğini unutmayın.
Yukarıdaki operasyonların yanı sıra başka bir operasyon daha var. kısa devre operasyon. Hem ara hem de terminal işlemleri kısa devre yapabilir.
css geçiş opaklığı
Bir ara işlem Sonsuz girişli bir akış varsa kısa devredir. Sonuç olarak sonlu bir akış üretebilir.
A terminal operasyonu Sonsuz girişli bir akış varsa kısa devredir. Sınırlı bir süre içinde sona erebilir.
Boru hattında kısa devre işleminin kullanılmasının gerekli olduğunu ancak yeterli olmadığını gözlemliyoruz. Sonsuz bir akışı işlemek için bir koşul vardır: İşlemi normal olarak sınırlı bir süre içinde sonlandırın.
Java 8 Stream.anyMatch()
Bu akışın herhangi bir öğesinin sağlanan yüklemle eşleşip eşleşmediğini döndürür. Sonucun belirlenmesi için gerekli olmadıkça yüklemi tüm unsurlar üzerinde değerlendirmeyebilir.
mycricketlive
Sözdizimi:
boolean anyMatch(Predicate predicate)
Parametreler: Bir kabul eder müdahale etmeyen Ve vatansız giriş akışının elemanlarına uygulanacak yüklem.
İadeler: Geri dönüyor doğru herhangi bir öğe belirtilen yüklemle eşleşirse, aksi takdirde false değerini döndürür. Akış boşsa false değerini döndürür. Boş bir akış durumunda yüklem değerlendirilmez.
Java anyMatch() Örneği
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); } }
Çıktı:
java dize ekleme
true
Aşağıdaki örnek, boş bir akışın her zaman false değerini döndürdüğünü göstermektedir.
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); } }
Çıktı:
false
Birden çok yüklemi ayrıştırdığımız başka bir Java programına bakalım.
ince algoritma
Birden çok koşulu karşılamak için iki veya daha fazla basit yüklemden oluşan bir yüklem oluşturun. Verilen örnekte, Çalışanların bir listesi var. Yaşı 28, ismi R harfi ile başlayan bir çalışanın olup olmadığını kontrol etmek istiyoruz. Aşağıdaki Java programında da aynısı anlatılmaktadır.
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>
Çıktı:
true true false
Akış arayüzü, belirtilen yüklemi eşleştirmek için başka bir yöntem sağlar; allMatch() . allMatch() ile anyMatch() arasındaki fark, anyMatch() işlevinin döndürmesidir doğru bir akıştaki öğelerden herhangi birinin belirtilen yüklemle eşleşip eşleşmediği. allMatch() kullanıldığında, tüm öğelerin verilen yüklemle eşleşmesi gerekir.
Bu nedenle, akışta en az bir öğe olup olmadığını kontrol etmek istediğimiz belirli durumlarda anyMatch() yöntemi kullanılabilir. List sınıfının include() yöntemi de aynı işlemi gerçekleştirir. Yani, anyMatch() yöntemi yerine include() yöntemini de kullanabiliriz.
Dolayısıyla List.contains() ve Stream.anyMatch() yöntemi arasında hiçbir fark yoktur.