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 arayüz, tam olarak bir soyut yöntem içeren bir arayüzdür. Bu tek yöntem kısıtlaması, işlevsel arayüzleri özel kılar; çünkü bunlar lambda ifadeleri kullanılarak uygulanabilir ve daha kısa bir kodlama tarzı sağlar.

Java, bir arayüzü işlevsel olarak açıkça işaretlemek için @FunctionalInterface ek açıklamasını sağlar. İsteğe bağlı olsa da bu ek açıklama, yanlışlıkla ikinci bir soyut yöntem eklersen derleyicinin hataları yakalamasına yardımcı olur:

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

İşlevsel bir arayüzü geleneksel şekilde bir sınıfla veya daha kısa olarak 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

FunctionalInterface'ler, varsayılan metotlara ve statik metotlara yine de sahip olabilir; çünkü bunlar tek soyut metot kuralına dahil edilmez. Java'nın java.util.function paketi, akışlar ve koleksiyonlarla çalışırken sıkça karşılaşacağınız Predicate, Function ve Consumer gibi birçok yerleşik işlevsel arayüz sağlar.

challenge icon

Görev

Kolay

Fonksiyonel arayüzleri ve lambda ifadelerini kullanarak bir dize dönüştürme sistemi oluşturalım. Dizelere farklı dönüşümler uygulayabilen esnek bir metin işlemcisi oluşturacaksın: tüm bunlar tek bir fonksiyonel arayüz tarafından desteklenecek.

Kodunu üç dosya arasında düzenleyeceksin:

  • StringTransformer.java: Herhangi bir dize dönüştürme işlemini temsil eden bir fonksiyonel arayüz tanımla. İşlevsel kalmasını sağlamak için @FunctionalInterface ek açıklamasıyla işaretle. Arayüzün, bir String alan ve bir String döndüren, transform adlı tek bir soyut yöntem bildirmeli.
  • TextProcessor.java: Metni işlemek için fonksiyonel arayüzünü kullanan bir sınıf oluştur. Bu sınıfta bir StringTransformer tutacak alan ve onu başlatacak bir oluşturucu bulunmalı. Verilen metne dönüştürücüyü uygulayan ve sonucu döndüren process(String text) adlı bir yöntem ekle. Bu tasarım, oluşturucu aracılığıyla herhangi bir dönüştürme davranışını enjekte etmene olanak tanır.
  • Main.java: Lambda ifadelerini kullanarak farklı dönüşümler oluşturup her şeyi bir araya getir. İki girdi alacaksın: bir metin dizesi ve bir işlem türü (upper, lower veya reverse).

    İşlem türüne göre uygun lambda ile bir TextProcessor oluştur:

    • 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)

    Ardından giriş metniyle process() yöntemini çağır ve sonucu şu biçimde yazdır: Result: [transformed text]

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

Aynı TextProcessor sınıfının, kendisine hangi lambdayı aktardığına bağlı olarak tamamen farklı işlemler gerçekleştirebildiğine dikkat et: fonksiyonel arayüzlerin gücü budur!

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 göre, uygun lambda ile bir TextProcessor oluştur:
        // - "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)
        
        // TODO: process() metodunu girdi metniyle çağır ve sonucu yazdır
        // Çı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

Kendi başına pratik yap: Online Java derleyicisi