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) );
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));
}
});
İ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) );
list.forEach( s -> System.out.println(s) );
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 );
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 this
ve super
değ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::method
x -> 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);
GO TO FULL VERSION