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)); // 8FunctionalInterface'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.
Görev
KolayFonksiyonel 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@FunctionalInterfaceek açıklamasıyla işaretle. Arayüzün, bir String alan ve bir String döndüren,transformadlı 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 birStringTransformertutacak alan ve onu başlatacak bir oluşturucu bulunmalı. Verilen metne dönüştürücüyü uygulayan ve sonucu döndürenprocess(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,lowerveyareverse).İşlem türüne göre uygun lambda ile bir
TextProcessoroluştur: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)
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]"
}
}
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ıKendi başına pratik yap: Online Java derleyicisi