Java'daki işlevsel bir arayüz, yalnızca bir soyut yöntem içeren bir arayüzdür. İşlevsel arayüzler birden fazla varsayılan veya statik yönteme sahip olabilir ancak yalnızca bir soyut yönteme sahip olabilir.
Java 8'den itibaren lambda ifadeleri ve yöntem referansları, işlevsel bir arayüzün örneğini temsil etmek için kullanılabilir.
Örnek: Lambda İfadesiyle İşlevsel Bir Arayüz Kullanma
Javapublic class Geeks { public static void main(String[] args) { // Using lambda expression to implement Runnable new Thread(() -> System.out.println('New thread created')).start(); } }
Çıkış
New thread created
Açıklama:
- Yukarıdaki program, Runnable fonksiyonel arayüzü ile lambda ifadesinin kullanımını göstermektedir.
- Runnable'ın bir soyut yöntemi run() vardır, dolayısıyla işlevsel bir arayüz olarak nitelendirilir.
- Lambda () -> System.out.println('Yeni iş parçacığı oluşturuldu'), run() yöntemini tanımlar.
- new Thread().start() lambda gövdesini çalıştıran yeni bir iş parçacığı başlatır
Not:
A F işlevsel olmayan arayüz başka bir işlevsel arayüzü de genişletebilir.
@FunctionalInterface Dipnot
@FunctionalInterface ek açıklaması, işlevsel arayüzün birden fazla soyut yönteme sahip olamayacağından emin olmak için kullanılır. Birden fazla soyut yöntemin mevcut olması durumunda derleyici bir 'Beklenmeyen @FunctionalInterface açıklaması' mesajını işaretler. Ancak bu açıklamanın kullanılması zorunlu değildir.
Not:
100 üzerinden 10 nedir
@FunctionalInterface ek açıklaması isteğe bağlıdır ancak kullanılması iyi bir uygulamadır. Arayüzün yalnızca bir soyut yönteme sahip olmasını sağlayarak hatanın erken aşamada yakalanmasına yardımcı olur.
Örnek: @FunctionalInterface Ek Açıklamasıyla İşlevsel Bir Arayüz Tanımlama
Java@FunctionalInterface interface Square { int calculate(int x); } class Geeks { public static void main(String args[]) { int a = 5; // lambda expression to define the calculate method Square s = (int x) -> x * x; // parameter passed and return type must be same as defined in the prototype int ans = s.calculate(a); System.out.println(ans); } }
Çıkış
25
Açıklama :
- Square, tek bir hesaplama yöntemine (int x) sahip işlevsel bir arayüzdür.
- Hesaplama yöntemini uygulamak için bir lambda ifadesi (int x) -> x * x kullanılır.
- Lambda girdi olarak x'i alır ve x * x değerini döndürür.
Java 8'den Önce Java İşlevsel Arayüzleri
Java 8'den önce anonim iç sınıf nesneleri oluşturmamız veya bu arayüzleri uygulamamız gerekiyordu. Aşağıda, lambda ifadelerinin kullanıma sunulmasından önce Runnable arayüzünün nasıl uygulandığına dair bir örnek verilmiştir.
Örnek: İşlevsel arayüzü gösteren Java programı
Javaclass Geeks { public static void main(String args[]) { // create anonymous inner class object new Thread(new Runnable() { @Override public void run() { System.out.println('New thread created'); } }).start(); } }
Çıkış
New thread created
Yerleşik Java İşlevsel Arayüzleri
Java SE 1.8'den bu yana, işlevsel arayüzlere dönüştürülen birçok arayüz bulunmaktadır. Tüm bu arayüzlere @FunctionalInterface ile açıklama eklenmiştir. Bu arayüzler aşağıdaki gibidir:
- Çalıştırılabilir: Bu arayüz yalnızca şunları içerir: koşmak() Yöntem.
- Karşılaştırılabilir: Bu arayüz yalnızca CompareTo() yöntemini içerir.
- Eylem Dinleyici: Bu arayüz yalnızca actionPerformed() yöntemini içerir.
- Çağrılabilir: Bu arayüz yalnızca call() yöntemini içerir.
Java'daki İşlevsel Arayüz Türleri
Java SE 8, aşağıda belirtildiği gibi birden fazla durumda uygulanabilecek dört ana türde işlevsel arayüz içeriyordu:
- Tüketici
- yüklem
- İşlev
- Tedarikçi
1. Tüketici
tüketici arayüzü İşlevsel arayüzün yalnızca bir argümanı veya soylulaştırılmış bir argümanı kabul eden arayüzüdür. Tüketici arayüzünün dönüş değeri yoktur. Hiçbir şey döndürmez. Tüketicinin işlevsel çeşitleri de vardır. Çift Tüketici Dahili Tüketici Ve Uzun Tüketici . Bu değişkenler ilkel değerleri argüman olarak kabul eder.
Bu varyantların dışında Tüketici arayüzünün bir çeşidi daha vardır: Çift Tüketici .
Sözdizimi:
Tüketici
tüketici = (değer) -> System.out.println(değer);
Java Tüketici işlevsel arayüzünün bu uygulaması, print ifadesine parametre olarak iletilen değeri yazdırır. Bu uygulama Java'nın Lambda işlevini kullanır.
2. Yüklem
Tahmin arayüzü bir argümanın boole değerli fonksiyonunu temsil eder. Akışlardaki filtreleme işlemleri için yaygın olarak kullanılır. Tıpkı Tüketici fonksiyonel arayüzü gibi Predicate fonksiyonel arayüzünün de bazı uzantıları vardır. Bunlar IntPredicate Çift Tahmin Ve Uzun Tahmin . Bu tür yüklem işlevsel arayüzleri, argüman olarak yalnızca ilkel veri türlerini veya değerlerini kabul eder.
Sözdizimi:
genel arayüz Yüklemi
{
boole testi(T t);
}
Java yüklemi işlevsel arayüzü, Lambda ifadeleri kullanılarak da uygulanabilir.
yüklem
yüklem = (değer) -> değer != null;
3. İşlev
A işlev Java'da yalnızca tek bir argüman alan ve gerekli işlemden sonra bir değer döndüren bir tür işlevsel arayüzdür. İşlev arayüzlerinin birçok farklı versiyonu araçsaldır ve double int long gibi ilkel türlerde yaygın olarak kullanılır.
Sözdizimi:
İşlev
fonksiyon = (değer) -> değer * değer;
- İki Fonksiyonlu: Çift Fonksiyonlu büyük ölçüde bir İşlevle ilgilidir. Ayrıca iki argüman alır, oysa Fonksiyon bir argüman kabul eder.
- Tekli Operatör ve İkili Operatör: Ayrıca şu şekilde adlandırılan iki işlevsel arayüz daha vardır: Tekli Operatör Ve İkili Operatör. Her ikisi de sırasıyla hem giriş tipinin hem de çıkış tipinin aynı olduğu Fonksiyon ve İki Fonksiyonu genişletir.
4. Tedarikçi
Tedarikçi işlevsel arayüz aynı zamanda herhangi bir girdi veya argüman almayan ve yine de tek bir çıktı döndüren bir tür işlevsel arayüzdür. Tedarikçi işlevsel arayüzünün farklı uzantıları, aşağıdakiler gibi diğer birçok tedarikçi işlevini de içerir: Boole Tedarikçisi Çift Tedarikçi UzunTedarikçi Ve Dahili Tedarikçi . Tüm bu ileri uzmanlıkların dönüş türü yalnızca bunlara karşılık gelen ilkellerdir.
Sözdizimi:
Tedarikçi
tedarikçi = () -> 'Merhaba Dünya!';
Örnek: Dizeleri Filtrelemek için Tahmin Arayüzünü Kullanma
Javaimport java.util.*; import java.util.function.Predicate; class Geeks { public static void main(String args[]) { // create a list of strings List<String> n = Arrays.asList('Geek' 'GeeksQuiz' 'g1' 'QA' 'Geek2'); // declare the predicate type as string and use lambda expression to create object Predicate<String> p = (s) -> s.startsWith('G'); // Iterate through the list for (String st : n) { // call the test method if (p.test(st)) System.out.println(st); } } }
Çıkış
Geek GeeksQuiz Geek2
Fonksiyonel Arayüzler Tablosu
Fonksiyonel Arayüzler | Tanım | Yöntem |
---|---|---|
Çalıştırılabilir | Bir iş parçacığı tarafından yürütülebilecek bir görevi temsil eder. | geçersiz çalıştırma() |
Karşılaştırılabilir | Sıralama için iki nesneyi karşılaştırır. | int karşılaştırma(T o) |
Eylem Dinleyici | Olay odaklı programlamada bir eylem olayını yönetir. | void actionPerformed(ActionEvent e) |
Aranabilir | Bir sonuç döndürebilen veya bir istisna atabilen bir görevi temsil eder. | V çağrısı () İstisna atar |
Tüketici | Tek bir giriş argümanını kabul eder ve sonuç döndürmez. | geçersiz kabul(T t) |
yüklem | Tek bir argümanı kabul eder ve bir boole sonucu döndürür. | boole testi(T t) |
İşlev | Tek bir argümanı kabul eder ve bir sonuç döndürür. | R uygula(T t) |
Tedarikçi | Herhangi bir argüman almaz, ancak bir sonuç sağlar. | T olsun() |
Çift Tüketici | İki argümanı kabul eder ve sonuç döndürmez. | geçersiz kabul et(T t U u) |
BiPredicate | İki argümanı kabul eder ve bir boole sonucu döndürür. | boole testi(T t U u) |
Çift Fonksiyon | İki argümanı kabul eder ve bir sonuç döndürür. java diziyi başlat | R uygula(T t U u) |
Tekli Operatör | Bu, giriş ve çıkış türlerinin aynı olduğu özel bir Fonksiyon durumudur. | T uygula(T t) |
İkili Operatör | Bu, giriş ve çıkış türlerinin aynı olduğu BiFunction'ın özel bir durumudur. | T uygula(T t1 T t2) |
İlgili Makaleler
- Java 8
- Java Lambda İfadeleri