Özet - Functional interface
- Java kursu
- İleri seviye
- Ders 18/82
- 5 dk
Function, Predicate ve Consumer'ı birleştirerek bir akış işleyici yazarsın.
Özet - Functional interface
Bu grupta dört temel işlevsel arayüzü ve @FunctionalInterface annotation'ını gördün. Function dönüştürür, Predicate koşul döndürür, Consumer tüketir, Supplier üretir. Hepsi tek soyut yönteme sahiptir ve lambda ile yazılabilir.
Bu arayüzleri birleştirerek kısa ve okunaklı kod yazarsın. Örneğin bir Predicate'ı filter'a, bir Function'ı map'e ve bir Consumer'ı forEach'e verirsin. Bu, akış işlemlerini tek satırda ifade etmenin standart yoludur.
Uygulama Function + Predicate + Consumer zinciri
Bir Function<String, Integer> len = String::length tanımla. Bir Predicate<Integer> big = n -> n > 4 tanımla. List.of("kalem", "saat", "defter") listesini bir for döngüsünde gez; big.test(len.apply(w)) doğruysa w'yi System.out.println ile yazdır.
Başlangıç kodu
import java.util.List;
import java.util.function.Function;
import java.util.function.Predicate;
// Function ile uzunluk, Predicate ile koşul tanımla
// for döngüsünde gez ve koşula göre yazdırÖrnek çözüm
import java.util.List;
import java.util.function.Function;
import java.util.function.Predicate;
public class ChainFunctional {
public static void main(String[] args) {
Function<String, Integer> len = String::length;
Predicate<Integer> big = n -> n > 4;
for (String w : List.of("kalem", "saat", "defter")) {
if (big.test(len.apply(w))) {
System.out.println(w);
}
}
}
}Beklenen çıktı
kalem defter
Ne zaman özel arayüz tanımlamalı?
Çoğu durumda java.util.function paketindeki arayüzler yeterlidir. Yalnızca işlevin özel bir anlamı varsa veya ilkel tür sürümleri işinizi görmüyorsa özel arayüz tanımlamak anlamlı olur.
Örneğin bir User -> boolean koşulu genelde Predicate<User> olarak taşınır. Ama kodda sürekli Predicate<User> yazmak okunaklığı bozuyorsa @FunctionalInterface interface UserRule tanımlamak daha temiz olabilir. Karar, kodun uzun süreli okunaklığına bağlıdır.
Uygulama Özel StringOp arayüzü tanımla ve kullan
@FunctionalInterface ile StringOp arayüzü tanımla; String transform(String input) yöntemi olsun. main içinde String::toUpperCase yöntem referansını StringOp değişkenine ata. transform("merhaba") çağrısının sonucunu System.out.println ile yazdır.
Başlangıç kodu
// StringOp arayüzünü tanımla (tek soyut yöntem ile)
// transform yöntemi bir dizgiyi çevirsin
// main içinde upper ile dönüşüm yap, sonucu yazdırÖrnek çözüm
@FunctionalInterface
interface StringOp {
String transform(String input);
}
public class CustomStringOp {
public static void main(String[] args) {
StringOp upper = String::toUpperCase;
System.out.println(upper.transform("merhaba"));
}
}Beklenen çıktı
MERHABA
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 Hangi arayüz bir değer alıp void döndürür?
- Function<T,R>
- Consumer<T> Doğru cevap
- Predicate<T>
- Supplier<T>
Açıklama: Consumer<T> değeri tüketir ve void döndürür.
2 Arayüzü davranışla eşleştir
| Kavram | Anlamı |
|---|---|
Function<T,R> |
Dönüştürür |
Predicate<T> |
Koşul döndürür |
Consumer<T> |
Tüketir |
Supplier<T> |
Üretir |