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)); // 8Fonksiyonel 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.
Görev
KolayFonksiyonel 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@FunctionalInterfaceanotasyonu ile işaretleyin. Arayüzünüz, bir String alan ve bir String döndürentransformadı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. BirStringTransformertutacak 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ürenprocess(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,lowerveyareverse).İşlem türüne bağlı olarak, uygun lambda ile bir
TextProcessoroluşturun:upper: metni büyük harfe dönüştürürlower: metni küçük harfe dönüştürürreverse: metni tersine çevirir (ipucu:StringBuilderkullanı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)); // 8Fonksiyonel 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]"
}
}
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
1OOP Temelleri
Harici DosyalarOOP'ye GirişSınıflar ve Nesnelerthis Anahtar KelimesiMetotlarAlanlar (Öznitelikler)Yapıcı MetotYapıcı Metot Aşırı YüklemeÖzet - Basit Hesap Makinesi4Kalıtım
Temel Kalıtım (extends)super Anahtar KelimesiMetot Geçersiz Kılma (@Override)Yapıcı Metot ZincirlemeObject SınıfıTekli ve Çok Seviyeli KalıtımNeden Çoklu Sınıf Kalıtımı Yok?Özet - Çalışan Hiyerarşisi7Özel Metotlar ve Object Sınıfı
toString() Metoduequals() ve hashCode()clone() MetoducompareTo() ve ComparableComparator ArayüzüÖzet - Özel Sıralama2Erişim Belirleyiciler ve Kapsülleme
Erişim Seviyelerine Genel BakışGetter ve Setter MetotlarıBilgi Gizlemefinal Anahtar KelimesiÖzet - Banka Hesabı Yöneticisi5Polimorfizm
Metot Aşırı Yükleme TemelleriMetot Geçersiz Kılma (Çalışma Zamanı)Upcasting ve Downcastinginstanceof OperatörüSoyut Sınıflar ve MetotlarÖzet - Şekil Hesaplayıcı8İleri Düzey OOP Kavramları
Kompozisyon vs KalıtımAgregasyon vs KompozisyonDahili, Yuvalanmış ve Anonim SınıflarEnum'lar ve Enum MetotlarıRecords (Java 16+)Sealed Classes (Java 17+)11Tasarım Kalıpları Bölüm 1
Tasarım Kalıplarına GirişSingleton KalıbıFactory KalıbıBuilder KalıbıObserver KalıbıStrategy Kalıbı14Final Meydan Okumaları
E-Öğrenme PlatformuBankacılık SistemiOyun Karakteri GeliştirmeAraç Kiralama Servisi3Sınıf Özellikleri ve Statik Üyeler
Instance ve Statik DeğişkenlerStatik MetotlarStatik BloklarSabitler (static final)Özet - Sayaç ve Utility6Arayüzler ve Soyut Sınıflar
Arayüzlere GirişArayüzleri UygulamaÇoklu Arayüz UygulamaArayüzlerde Default ve StaticSoyut Sınıflar ve ArayüzlerFonksiyonel ArayüzlerÖzet - Ödeme Sistemi9Generics
Generics'e GirişGeneric SınıflarGeneric MetotlarSınırlandırılmış Tip ParametreleriWildcard'lar (?, extends, super)Özet - Generic Container12Tasarım Kalıpları Bölüm 2
Komut KalıbıAdaptör KalıbıDekoratör KalıbıŞablon Metot KalıbıDurum KalıbıKompozit KalıbıYineleyici Kalıbı