logo

Java İşlevsel Arayüzleri

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

Java
public 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ı

Java
class 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:

  1. Tüketici
  2. yüklem
  3. İşlev 
  4. 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çitedarikçi = () -> 'Merhaba Dünya!';

Örnek: Dizeleri Filtrelemek için Tahmin Arayüzünü Kullanma

Java
import 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