12 Ağustos 2019 Pazartesi

Java 8 -- STREAM EXAMPLES




Asagidaki sekilde bir kod NullPointerException verir. Cunku array initialize edilmeden index teki degerine ulasilmaya calisiliyor.



Bunu onlemek icin Optional kullanabiliriz.





Bu sekilde yazdigimizda ise 3.index bos degilse if icine girip 3.indexin degerini yazar. Bos ise nullpointerexception vermeyecek, hic bir sey yapmadan hatasiz sonlanacaktir.

Eger lambda expression tek satirsa { suslu paranteze gerek yok.
Return type ve input type a gerek yok.
method un access modifier icermesine gerek yok(public, private vs)
Lambda expression in bir degiskene atanmasi gerekir.

public void showMsg(String name){
    System.out.println("Hello "+ name);
}

Bu kod satiri su hale gelir:

OrnekClass ornekClass = name -> System.out.println("Hello "+ name);

FunctionalInterface

Sadece bir tane abstract method iceren interface dir. Interface in uzerine @FunctionalInterface eklenir.

Ayni islemin Java8 den once ve Java 8 ile nasil yapildgini gosteren 2 resim asagidadir. Java8 ile interface implementation icin farkli bir sinifa ihtiyac duymayiz, gerekli sinifta implement edebiliriz.








Function Interface

FunctionInterface bir input ve output tan olusan interface dir.

Function<T, R> seklinde T: input, R: output type i belirtir. Asagida sayinin karesini bulan bir ornek var hem java8 den once hem de java8 ile.  Kare bulmak icin bir tane input girer ve sonucta bir output aliriz. Bu yuzden FunctionInterface bize uygundur. Avantaji ise gordugumuz gibi Java8den once islemi yapmasi icin yeni bir method olusturduk. Java8 ile yeni bir method olusturmaya gerek olmadan predefined methodlarla ihtiyacimizi karsiladik.



Output: Square of number is :25
             Square of number is :25


Function Interface in apply disinda diger bir default methodu olan andThen() methoduna bakalim.  Eger bir method output unun diger bir methoda input olmasini istiyorsak andThen() kullaniriz.



Output : Function1: HELLO
              Function2: HELLO WORLD

Diger bir method ise compose() . andThen in tam tersi seklinde calisir. Once diger method calisir. Yukardaki ornek icin konusursak once function2 calisacak yani "hello WORLD" elde edicez daha sonra function1 calisip hepsini uppercase yapicak ve "HELLO WORLD" elde edicez.

Kullanimi ise ayni andThen seklinde sadece yerine compose yazilir.

Supplier Interface 

Burada ise sadece output vardir. Herhangi bir input yoktur.



Consumer Interface

Supplier in tam tersine tek bir input alir ve hic bir output dondurmez.



ForEach 




Default Interface

Java da interface genel bir taslaktir. Methodlar sadece tanimlanir. Icerikleri ise interface leri implemente eden siniflarda kodlanir. Ama interface lerin soyle bir dezavantaji var ; Interface de tanimlanan tum methodlar implemente edilmek zorunda yoksa compilation hatasi verir. Simdi soyle bir case dusunelim. Diyelim ki ilerde interface e yeni bir method eklememiz gerekiyor. Bu durumda diger tum classlar bu methodu implemente etmek zorunda yoksa compile time hatasi alir. Bu hem cok uzun olur hem de stakeholder lar tarafinda kabul edilmeyebilir. Bu durumda Java 8 ile gelen yeni bir ozellik olan default kullanabiliriz. Interface deki methodun basina default yazarak methodun default calismasini interface icersinde kodlariz. Bu sekilde bir implementasyonu oldugu icin diger class larda implemente edilmese de sorun yaratmaz, isteyen de implemente edebilir.





Static Method

Interface lerde static methodlar tanimlanabilir. Bu methodlarin icerigi interface de tanimlanmak zorundadir. Ve onu cagiran classlarda static methodlar override edilemez. Icerigi degistirelemez cunku compile hatasi verir. Static methodlar icinden non-static methodlara erisilemez. Interface de yer alan static methodlara erismek icin obje olusturmaya gerek yoktur, interfaceAdi.methodAdi seklinde erisilir.



Hiç yorum yok:

Yorum Gönder