1. İşlev yöntemleri

Bir arabirimin yalnızca bir yöntemi varsa , o arabirim türündeki bir değişkene bir lambda ifadesi (lambda işlevi) tarafından verilen bir değer atanabilir . Bu tür arabirimler, işlevsel arabirimler olarak bilinmeye başlandı (Java, lambda işlevleri için destek ekledikten sonra).

Örneğin, Java Consumer<Type>, yöntemi içeren bir arayüze sahiptir accept(Type obj). Bu arayüz neden gerekli?

Java 8'de koleksiyonların, koleksiyonun her öğesi için bazı eylemler gerçekleştirmenizeforEach() izin veren bir yöntemi vardır . Ve burada işlevsel arayüz, eylemi yönteme iletmek için kullanılır . Consumer<T>forEach()

Bir koleksiyonun tüm öğelerini şu şekilde görüntüleyebilirsiniz :

ArrayList<String> list = new ArrayList<>();
Collections.addAll(list, "Hello", "how's", "life?");

list.forEach( (s) -> System.out.println(s) );
Bir koleksiyonun tüm öğelerini görüntüleme (bir lambda ifadesi kullanarak)

Derleyici yukarıdaki kodu aşağıdaki koda çevirecektir:

ArrayList<String> list = new ArrayList<>();
Collections.addAll(list, "Hello", "how's", "life?");

list.forEach(new Consumer<String>()
{
   public void accept(String s)
   {
      System.out.println(s));
   }
});
Bir koleksiyonun tüm öğelerini görüntüleme (anonim bir sınıf kullanarak)

İlk versiyon kesinlikle ikinciden daha kısadır. Ve lambda ifadeleri içeren kodu okumak zor olsa da, anonim iç sınıfları olan kodu okumak bazen daha da zordur.



2. Yöntem referansı

Ancak lambda ifade kodumuz daha da kısa yazılabilir.

İlk olarak, parametrenin etrafındaki parantezleri atlayabilirsiniz s:

list.forEach( (s) -> System.out.println(s) );
Önce
list.forEach( s -> System.out.println(s) );
Sonrasında

Bu yalnızca bir parametre varsa yapılabilir . Birden çok parametre varsa parantez kullanmanız gerekir .

İkincisi, bunu şu şekilde yazabilirsiniz:

list.forEach( System.out::println );
En kompakt notasyon

Bu tamamen aynı notasyon. dan sonra parantez olmadığına dikkat edin println.

Burada aynı koda sahibiz — bir yöntem çağrısı:

object::method
x -> object.method(x)

Bir düşünün: koleksiyonun her öğesi için bazı işlemler yapmak istedik list. Eylem tek bir işlev çağrısıysa (örneğin println()), o zaman işlevi yönteme bir parametre olarak basitçe iletmek mantıklıdır.

Ancak, yöntemi çağırmak yerine geçmek istediğimizi derleyiciye nasıl açıklayacağız? Bunu yapmak için nokta operatörü yerine yöntem adından önce iki nokta üst üste kullanırız . Üçlü operatörü belirtmek için zaten tek bir iki nokta üst üste kullanılmıştır.

Bu, en basit ve en kompakt notasyondur.



3. Yapıcı

G/Ç akışlarıyla çalışırken çift kolonlu yöntem referansları çok kullanışlıdır. Bunu biraz sonra göreceksiniz.

Bu arada, bir metot referansını iletmenin 3 popüler yolundan bahsedelim:

Bir nesnenin yöntemine başvuru

Bir nesnenin yöntemine referans iletmek için, gibi bir şey yazmanız gerekir . Bu kod eşdeğerdir .object::method
x -> object.method(x)

Özel thisve superdeğişkenler nesne olarak kullanılabilir.

Bir sınıfın yöntemine başvuru

Statik bir yönteme referans iletmek için, gibi bir şey yazmanız gerekir . Bu kod, aşağıdaki gibi bir koda dönüştürülür:class::methodx -> class.method(x);

Bir oluşturucuya başvuru

Yapıcı, statik bir sınıf yöntemine benzer şekilde davranır, dolayısıyla bir kurucuya referans da iletebilirsiniz. Bu şekilde görünüyor: .class::new

Örneğin, koleksiyonlar için tür silme sorununu çözebilir ve yönteme, toArray()istenen diziyi oluşturacak bir yapıcıya bir başvuru iletebilirsiniz:toArray(int[]::new);