Menu
Coddy logo textTech

Fonksiyonel Arayüzler

Coddy'nin Java Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 39 / 87.

İşlevsel bir arayüz (functional interface), tam olarak bir adet soyut yöntem içeren bir arayüzdür. Bu tek yöntem kısıtlaması, işlevsel arayüzleri özel kılar çünkü lambda ifadeleri kullanılarak uygulanabilirler ve bu da daha kısa ve öz bir kodlama stili sağlar.

Java, bir arayüzü açıkça fonksiyonel olarak işaretlemek için @FunctionalInterface anotasyonunu sağlar. İsteğe bağlı olsa da, bu anotasyon yanlışlıkla ikinci bir soyut metot eklerseniz derleyicinin hataları yakalamasına yardımcı olur:

@FunctionalInterface
public interface Calculator {
    int calculate(int a, int b);
}

Bir fonksiyonel arayüzü geleneksel yöntemle bir sınıfla veya daha kısa bir şekilde bir lambda ifadesiyle uygulayabilirsiniz:

// Geleneksel uygulama
Calculator adder = new Calculator() {
    @Override
    public int calculate(int a, int b) {
        return a + b;
    }
};

// Lambda ifadesi (çok daha kısa!)
Calculator adder = (a, b) -> a + b;

System.out.println(adder.calculate(5, 3));  // 8

Fonksiyonel arayüzler, tek soyut metot kuralına dahil edilmedikleri için hala varsayılan metotlara ve statik metotlara sahip olabilirler. Java'nın java.util.function paketi, stream'ler ve koleksiyonlarla çalışırken sıkça karşılaşacağınız Predicate, Function ve Consumer gibi birçok yerleşik fonksiyonel arayüz sağlar.

challenge icon

Görev

Kolay

Fonksiyonel arayüzler (functional interfaces) ve lambda ifadeleri kullanarak bir dize dönüştürme sistemi oluşturalım. Tek bir fonksiyonel arayüz tarafından desteklenen, dizelere farklı dönüşümler uygulayabilen esnek bir metin işlemcisi oluşturacaksınız.

Kodunuzu üç dosya halinde düzenleyeceksiniz:

  • StringTransformer.java: Herhangi bir dize dönüştürme işlemini temsil eden bir fonksiyonel arayüz tanımlayın. Fonksiyonel kalmasını sağlamak için @FunctionalInterface anotasyonu ile işaretleyin. Arayüzünüz, bir String alan ve bir String döndüren transform adında tek bir soyut metot bildirmelidir.
  • TextProcessor.java: Metni işlemek için fonksiyonel arayüzünüzü kullanan bir sınıf oluşturun. Bir StringTransformer tutacak bir alana ve bunu başlatan bir yapıcıya (constructor) sahip olmalıdır. Verilen metne dönüştürücüyü uygulayan ve sonucu döndüren process(String text) adında bir metot ekleyin. Bu tasarım, herhangi bir dönüştürme davranışını yapıcı aracılığıyla enjekte etmenize olanak tanır.
  • Main.java: Lambda ifadelerini kullanarak farklı dönüşümler oluşturarak her şeyi bir araya getirin. İki girdi alacaksınız: bir metin dizesi ve bir işlem türü (upper, lower veya reverse).

    İşlem türüne bağlı olarak, uygun lambda ile bir TextProcessor oluşturun:

    • upper: metni büyük harfe dönüştürür
    • lower: metni küçük harfe dönüştürür
    • reverse: metni tersine çevirir (ipucu: StringBuilder kullanın)

    Ardından giriş metniyle process() metodunu çağırın ve sonucu şu formatta yazdırın: Result: [transformed text]

İki girdi alacaksınız: dönüştürülecek metin (String) ve işlem türü (String).

Aynı TextProcessor sınıfının, hangi lambdayı geçirdiğinize bağlı olarak nasıl tamamen farklı işlemler gerçekleştirebildiğine dikkat edin; işte fonksiyonel arayüzlerin gücü budur!

Kopya kağıdı

Bir fonksiyonel arayüz (functional interface), tam olarak bir soyut metoda sahip olan bir arayüzdür. Daha kısa kod yazımı için lambda ifadeleri kullanılarak uygulanabilir.

Bir arayüzü fonksiyonel olarak işaretlemek için @FunctionalInterface anotasyonunu kullanın (isteğe bağlıdır ancak önerilir):

@FunctionalInterface
public interface Calculator {
    int calculate(int a, int b);
}

Fonksiyonel arayüzler geleneksel yöntemle veya lambda ifadeleriyle uygulanabilir:

// Geleneksel uygulama
Calculator adder = new Calculator() {
    @Override
    public int calculate(int a, int b) {
        return a + b;
    }
};

// Lambda ifadesi
Calculator adder = (a, b) -> a + b;

System.out.println(adder.calculate(5, 3));  // 8

Fonksiyonel arayüzler, tek soyut metod kuralını ihlal etmeden varsayılan (default) ve statik (static) metodlara sahip olabilirler.

Java'nın java.util.function paketi; Predicate, Function ve Consumer gibi yerleşik fonksiyonel arayüzler sağlar.

Kendin dene

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String text = scanner.nextLine();
        String operation = scanner.nextLine();
        
        TextProcessor processor;
        
        // TODO: İşlem türüne bağlı olarak, uygun lambda ile bir TextProcessor oluşturun:
        // - "upper": metni büyük harfe dönüştürür
        // - "lower": metni küçük harfe dönüştürür
        // - "reverse": metni tersine çevirir (ipucu: StringBuilder kullanın)
        
        // TODO: Giriş metni ile process() metodunu çağırın ve sonucu yazdırın
        // Çıktı formatı: "Result: [transformed text]"
    }
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Nesne Yönelimli Programlama bölümündeki tüm dersler