Functional Interface & Lambda Expression & Diamond Problem
Functional Interface hakkında bilmemiz gerekenler;
- Java8 ile gelmiş bir interface yapısıdır.
- Functional interface’ler, functional programming temelini oluşturmaktadır.
- Kesin ve en net kuralı, Functional Interface’de en az ve en çok 1 tane abstract method bulunmalıdır.
- Eğer sub interface’imiz super interface’i extends ediyorsa ve super interface’de abstract method varsa sub interface’de abstract method olamaz.
- Aksi takdirde interface’imiz Functional Interface olamaz.
- Functional Interface’de java.lang.Object sınıfında yer alan bir method eklenirse bu sayılmaz ve Functional Interface özelliğini korur.
- Lambda ifadeleri ile birlikte kullanılmaktadır.
Basit olarak Functional Interface tanımı;
Başka Functional Interface örnek kod;
Başka Functional Interface örnek kod;
Lamda Expression
Lambda Expression hakkinda bilmemiz gerekenler;
- Functional Interface ile kullanilmaktadir.
- Birden fazla parametre olduğunda virgül ile ayrılır.
- Arrow operatörü zorunludur. ( -> )
- Lambda body ifadesi expression ya da block olabilir.
- Compiler, tanımlamış olduğumuz functional parametrelerin tipini yazmasak bile kendisi çıkarımda bulunur.
- Eğer özellikle tanımlamış olduğumuz functional parametlerden birinin tipini belirtirsek, diğerlerini de belirtmek zorundayız.
- Aksi durumda compiler hatası verir.
- Parametreleri parantez içerisine alabiliriz.
- Eğer sadece 1 parametre varsa, bu durumda parantez kullanmayabiliriz.
- Parantez koymadığımız parametrelerin tipini açık şekilde belirtemeyiz.
- Eğer lambda ifadesi dışındaki bir değişkeni lambda expression içerisinde kullanıyorsak o değeri başka bir satırda değiştirmememiz gerekmektedir.
Bazı geçerli lambda örnekleri;
- (int x) -> x + x
- x -> x % x
- () -> 7
- (int arg1, int arg2) -> (arg1 + arg2) / (arg1 — arg2)
Bazı geçersiz lambda örnekleri;
- -> 7 (eğer parametre almıyorsa () koymak zorundayız.)
- (arg1, int arg2) -> arg1 / arg2 (eğer bir parametrenin tipini belirttiysek diğerlerini de belirtmek zorundayız.)
Şimdi yukarıda anlattıklarımızı örnek kodlarla pekiştirelim,
Lambda parametresiz functional interface örnek kod olarak;
Lambda tek parametreli functional interface örnek kod olarak;
Lambda birden fazla parametreleri functional interface örnek kod olarak;
Geri dönüşü olan (return) abstract fonksiyon örnek kod olarak;
Lambda, Functional Interface ile if condition ifadelere örnek kod olarak;
Lambda expression dışında tanımlanan değişkene( local variable) örnek kod olarak;
Lambda ifadesi ile bir class’ın örneğinin üretilmesi örnek kod olarak;
Interface Özellikleri
Interface özelliklerinde yeni olarak bilmemiz gerekenler;
- Static methodlar, private methodlar tanımlanabilmektedir. ( java9 ile geldi. )
- Bildiğiniz gibi class’larda C++’da bulunan diamond problemi java da yoktu.
- Fakat interface’lerde static methodlar tanımlayabildiğimiz için burada diamond sorunu karşımıza çıkmaktadır.
- Çözümünü aşağıda inceleyeceğiz.
- Bir diğer özellik ise default methodlar, default methodları override edebiliriz.
- Static methodları inerfaceismi.staticMethodAdi ile çağırabilmemize olanak sağlanmaktadır.
Interface static ve private method örnek kod olarak;
Interface static methodlara erişim, extends ve class yapısındaki static methodlara erişim farkını gösterecek olursak, örnek kod olarak;
Yukarıdaki örnek kodda bilmemiz gereken en önemli noktalar;
- Interface’ de yer alan default methodları override edebilmekteyiz.
- Interace’ de bulunan static methdlara interfaceAdi.staticMethodAdi ile ulaşabilmekteyiz.
- Bu methodları değişkenler üzerinden çağıramıyoruz.
- Ama class yapısında bu durum farklıdır.
- Örnekte görüldüğü üzere Super class ve Sub class’ımız bulunmaktadır.
- Super class’ımızda bulunan static methoda hem class ismiyle hemde değişkenler üzerinden erişim sağlayabilmekteyiz.
Diamond Problem
Nedir Diamond Problem?
- Görselde de görüldüğü üzere C++ dilinde 2 class extends ettiğimizi varsayalım,
- ClassA ve ClassB’ de aynı isimde farklı iş yapan methodlar varsa, burada diamond problem meydana gelmektedir.
- Çünkü aynı method adıyla iki farklı iş yapan method bulunmaktadır.
- Bu java’da class yapısında izin verilmediği için zaten diamond problem gibi bir derdimiz yok.
- Fakat interface yapısında buna izin verilmektedir ve karşımıza bu problem çıkmaktadır.
- Eğer bir class başka bir classı extends ediyorsa ve aynı zamanda bir interface’i implements ediyorsa, ikisinde de aynı method adı varsa bu durumda class win kuralı geçerlidir ve class içerisindeki method çalışır.
Örnek kod olarak;
Class win’ e örnek kod olarak;
Github : FunctionalInterface