Java 8 | Predicate
2 min readSep 10, 2020
Predicate hakkında bilmemiz gerekenler;
İlk önce functional interface’i anlamamız gerekmektedir.
- Java8 ile hayatımıza giren functional interface’lerden bir tanesidir.
- Contidition’ları kontrol edip bir boolean değer döndürür.
- java.util.function paketi içerisinde bulunmaktadır.(#boolean test(T t))
- Stream’de bulunan filter methodu predicate parametresi almaktadır ve filtreleme yapabilmekteyiz.
Örnek kodlar ile inceleyecek olursak;
Yukarıdaki örnekte,
- 3 tane farklı predicate tanımladık.
- Stream’de bulunan filter özelliği ile predicate1 ‘e göre filtreledik.
Başka bir örnek;
- Elimizde bulunan List’i Stream yapıyoruz.
- 8. satırda predicate oluşturarak length 4 olanları seçmesi için kural belirtiyoruz.
- 9. satırda stream’e filter uygulayarak oluşturduğumuz predicate’i veriyoruz ve ekrana yazdırıyoruz.
- Eğer stream’e filter uyguladıktan sonra tekrar List şeklinde almak istiyorsak 12. satırda bulunduğu gibi .collect(Collectors.toList()) yapabiliriz.
Başka bir örnek;
- 5. satırda null check bir predicate tanımladık
- 6. satırda String değerin uzunluğu 2 den fazla kontrolü yapan bir predicate tanımladık.
- 9. satırda bu iki predicate’i birleştirdik.
- Predicate eğer Stream ile filter uygulamazsak true/false döneceğini söylemiştik.
Başka bir örnek;
- 4. satırda bir ArrayList oluşturduk ve içerisine bazı değerler ekledik.
- 14. satırda Collection içerisinde bulunan removeIf methodunu kullanarak içerisine bir predicate tanımladık ve ‘h’ karakteri ile başlayanları seçtirdik.
- Eğer istenilirse removeIf() den önce ayrı bir predicate tanımlayıp sadece predicate değişkenini verebilirdik.
Predicate<String> predicate1 = element -> element.startsWith("h");
stringTempList.removeIf(predicate1);
Başka bir örnek;
- 4. satırda sonucu boolean olacak işlemlerde String::isEmpty şeklinde daha basit ve kısa kullanım örneği veriyoruz.
- 7. satırda geri dönüşü int olan bir işleme uygulamak istediğimizde compile error alacağız, çünkü bu kullanım sadece boolean değerlerde geçerlidir.
- 10. satırda 4. satırdan biraz daha uzun olan empty kontrolü yapan bir predicate tanımlıyoruz.
- 12. satırda String::startsWith kullanmak istediğimizde hata almaktayız çünkü bu kullanım parametre alan methodlar için uygun değildir.(public boolean startsWith(String prefix))
- 16. satırda 4. ve 10. satırda yaptığımız empty kontrolünün daha uzun halini görüyoruz.
Github: Predicate