Java
Özet - Functional interface
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.
Örnek çözümü göster
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);
}
}
}
}
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.
Örnek çözümü göster
@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"));
}
}
Kendini test et
-
Hangi arayüz bir değer alıp void döndürür?
- Function<T,R>
- Consumer<T>
- Predicate<T>
- Supplier<T>
Cevabı göster
Consumer<T> — Consumer<T> değeri tüketir ve void döndürür.
-
Arayüzü davranışla eşleştir
- Function<T,R>
- Dönüştürür
- Predicate<T>
- Koşul döndürür
- Consumer<T>
- Tüketir
- Supplier<T>
- Üretir
Sıradaki ders: LocalDate