CodeBlanks Logo Icon CodeBlanks

Ö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.

Başlangıç kodu

Main.java
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

Main.java
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

Main.java
// 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

Main.java
@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

İleri seviye bölümündeki tüm dersler