Java8 eBook

July 31, 2017 | Author: onurguney | Category: N/A
Share Embed Donate


Short Description

e...

Description

Java 8 Ebook Rahman Usta

İçindekiler Önsöz ......................................................................................................................... xi 1. Lambda Expression nedir? Nasıl kullanırım? ............................................................. 1 1.1. Lambda nedir? .............................................................................................. 1 1.2. Javascript ile Lambda – Basit Giriş ................................................................ 1 1.3. Lambda Java 8 öncesinde nasıldı? ................................................................ 2 1.4. Java 8 ve Lambda ifadeleri ............................................................................ 3 2. Lambda ifadeleri ve Fonksiyonel arayüzler ................................................................ 5 2.1. Functional Interfaces ..................................................................................... 5 3. Tarih ve Saat işlemleri ............................................................................................. 9 3.1. LocalDate ..................................................................................................... 9 3.2. LocalTime ................................................................................................... 10 3.3. LocalDateTime ............................................................................................ 11 3.4. ZoneId ........................................................................................................ 12 3.5. ZonedDateTime ........................................................................................... 13 4. Consumer Arayüzü ................................................................................................. 15 4.1. Java 8 öncesi ............................................................................................. 4.2. Java 8 sonrası ............................................................................................ 4.3. Lambda deyimleri akıllıdır ............................................................................ 4.4. Consumer arayüzü nerede kullanılıyor? ........................................................ 4.5. Lambda deyimlerini Metod Referansları ile kullanabiliriz. ................................ 5. Lambda örnekleri ................................................................................................... 5.1. Consumer Arayüzü ...................................................................................... 5.2. BiConsumer Arayüzü ................................................................................... 5.3. Function Arayüzü ........................................................................................ 5.4. UnaryOperator Arayüzü ............................................................................... 5.5. BiFunction Arayüzü ..................................................................................... 5.6. BinaryOperator Arayüzü ............................................................................... 5.7. Predicate Arayüzü ....................................................................................... 5.8. BiPredicate Arayüzü .................................................................................... 5.9. Supplier Arayüzü ......................................................................................... 6. Notasyonlar ve Tekrarlı Notasyonlar ........................................................................ 6.1. Notasyonlar ve Alanları ................................................................................

15 16 16 17 17 19 19 19 20 20 21 21 21 22 22 25 27

6.2. Notasyonlara Erişim ..................................................................................... 6.3. Notasyonların Tekrarlı Kullanılması ............................................................... 7. Method Reference .................................................................................................. 7.1. Bir metodu referans vermek .........................................................................

28 29 31 32

iii

Java 8 Ebook

8. Default Methods ..................................................................................................... 8.1. Varsayılan Metoda Giriş ............................................................................... 8.2. Varsayılan metodlarda çakışma .................................................................... 8.3. Varsayılan metodlar ve Fonksiyonel arayüzler ............................................... 8.4. Varsayılan metodlar ve JDK ......................................................................... 9. Stream API ............................................................................................................ 9.1. Stream nesnesi nasıl elde edilir? .................................................................. 9.1.1. Collection API ile ..............................................................................

37 37 39 41 42 45 46 46

9.1.2. New I/O ile ....................................................................................... 9.1.3. IntStream, DoubleStream, LongStream ile .......................................... 9.2. Stream API Örnekleri ................................................................................... 9.2.1. forEach ............................................................................................ 9.2.2. filter ................................................................................................. 9.2.3. distinct ............................................................................................. 9.2.4. sorted .............................................................................................. 9.2.5. limit .................................................................................................. 9.2.6. count ................................................................................................ 9.2.7. collect .............................................................................................. 9.2.8. map ................................................................................................. 9.2.9. reduce .............................................................................................. 9.2.10. map & reduce ................................................................................. 9.3. Parallel Stream ........................................................................................... 9.4. Lazy & Eager operasyonlar .......................................................................... 10. Java 8 ve JVM Dilleri ........................................................................................... 10.1. JVM Dilleri ................................................................................................ 10.2. Java Scripting API ..................................................................................... 10.3. ScriptEngine .............................................................................................. 10.4. Nashorn JavaScript Motoru ........................................................................ 11. Java 8 Optional Yeniliği ........................................................................................ 11.1. Optional Oluşturmak .................................................................................. 11.2. #ifPresent - Varsa yap, yoksa yapma .......................................................... 11.3. #map - Dönüştürme ................................................................................... 11.4. #filter - Filtreleme ...................................................................................... 11.5. #orElse - Varsa al, yoksa bunu al ...............................................................

47 48 48 48 49 49 50 50 50 51 52 53 54 56 57 59 59 61 61 62 63 63 64 65 65 65

11.6. #orElseGet - Varsa al, yoksa üret ............................................................... 11.7. #orElseThrow - Varsa al, yoksa fırlat .......................................................... 12. Java 8 Embedded ................................................................................................ 12.1. JavaFX Extension ......................................................................................

66 66 69 71

iv

Java 8 Ebook

12.2. Nashorn Extension .................................................................................... 72 12.3. Java 8 ME vs Java 8 Embedded ................................................................ 72 13. CompletableFuture ile Asenkron Programlama ....................................................... 75 13.1. Syncronous vs. Asyncronous ..................................................................... 75 13.2. CompletableFuture#allOf ............................................................................ 77 13.3. CompletableFuture#anyOf .......................................................................... 78 13.4. CompletableFuture#supplyAsync ................................................................ 79 13.5. İlk yol, join() metodu kullanmak............................................................ 80 13.6. İkinci yol, thenAccept* metodu kullanmak.............................................. 81 13.7. CompletableFuture#runAfterBoth* ............................................................... 81 13.8. CompletableFuture#runAfterEither* ............................................................. 82 13.9. CompletableFuture#handle* ....................................................................... 82 14. Java ME 8 Embedded ve Raspberry PI ................................................................. 85 14.1. Java ME 8 ile Raspberry PI üzerinde LED yakma ........................................ 86 14.2. Donanımsal Gereksinimler ......................................................................... 86 14.2.1. Raspberry PI .................................................................................. 86 14.2.2. Bread Board ................................................................................... 86 14.2.3. SD Kart .......................................................................................... 87 14.2.4. Adaptör .......................................................................................... 87 14.2.5. Wifi adapter .................................................................................... 87 14.2.6. Kablo, Led, GPIO Extension Board .................................................. 88 14.2.7. HDMI Kablosu ................................................................................ 89 14.2.8. Klavye ve Maus .............................................................................. 89 14.3. Yazılımsal Gereksinimler ............................................................................ 89 14.4. Raspbian OS Kurulması ............................................................................. 91 14.4.1. Devrenin Kurulması ......................................................................... 91 14.5. Java ME 8’in Raspberry PI’ye Yüklenmesi .................................................. 93 14.6. Java ME’nin Çalıştırılması .......................................................................... 95 14.7. Device Manager’a Rapberry PI Tanıtmak .................................................... 95 14.8. Java ME 8 Embedded Projesinin Oluşturulması ........................................... 97 14.8.1. Adım 1 ........................................................................................... 97 14.8.2. Adım 2 ........................................................................................... 98 14.8.3. Adım 3 ........................................................................................... 98 14.9. Uygulamanın Yazılması ............................................................................. 99 14.10. Projeye Aygıtı Tanıtmak ......................................................................... 14.11. Uygulama İzinlerini Tanımlamak .............................................................. 14.12. Uygulamanın Çalıştırılması ..................................................................... A. Bu kitap nasıl yazıldı? ..........................................................................................

101 102 103 105

v

Önsöz Java 8 ve yeniliklerini içeren bu kitap ile, Java programlama dilinin en yeni özelliklerini öğrenebilirsiniz. Java 8 Ebook kodcu.com içermektedir.

1

'da Rahman Usta

2

tarafından kaleme alınan Java 8 yazılarını

1 http://kodcu.com 2 http://kodcu.com/author/rahmanusta/

xi

Bölüm 1. Lambda Expression nedir? Nasıl kullanırım? Merhaba arkadaşlar; Bugün sizlerle Java 8 (Project Lambda) ile Java ortamına katılan Lambda ifadelerinden (Lambda expression) bahsetmek istiyorum.

1.1. Lambda nedir? Programlama dili çerçevesinde Lambda, anonim tekil görevler olarak değerlendirilebilir. Lambda deyimleri (Lambda fonksiyonları da denebilir), referans verilebilir ve tekrar tekrar kullanılabilirdir. Genel kullanım açısından Lambda fonksiyonları, diğer bir fonksiyona argüman olarak iletilebilirdir. Böylece, bir tarafta tanımlanan iş birimi, diğer bir iş biriminde koşturulabilir olmaktadır. Burada dikkat çekilecek unsur, bir iş biriminin diğer bir uygulama birimine referans olarak eriştirilebilirliğidir.

1.2. Javascript ile Lambda – Basit Giriş Javascript dilinde Array sınıfının prototype alanında forEach isimli bir iş birimi (fonksiyon) bulunmaktadır. forEach fonksiyonu, parametre olarak bir anonim Javascript fonksiyonunu kabul etmektedir. forEach fonksiyonuna, parametre olarak tanımlanan anonim fonksiyon, forEach fonksiyonu içerisinde koşturulmaktadır. Bu sayede iş mantığı, diğer fonksiyona paslanmış olmaktadır. Örnek 1: var dizi = [1,2,3,4,5]; // Bir javascript dizisi // Anonim fonksiyon her bir elemanı çıktılıyor. dizi.forEach(function(e){ //

(1)

console.log("Eleman: ",e); });

Yukarıda (1) numaralı kısımdaki anonim fonksiyon yani lambda fonksiyonu, forEach metodu içerisinde koşturulmaktadır. forEach metodu içerisindeki benzer yaklaşımı, kendi fonksiyonumuz ile oluşturalım.

1

Lambda Java 8 öncesinde nasıldı? var fonk= function(a,b,callback){ // Lambda fonksiyonu "callback" burada koşturulur. return callback(a,b)*2; //

(2)

} var result = fonk(2,3,function(a,b){ // (1) // Bu Lambda fonksiyonu 2 argümanı toplar. return a+b; }); console.log("Sonuç ..: ",result); // Sonuç : (2+3)*2 = 10

Tekrar ederek, Lambda fonksiyonları için referans verilebilir iş birimleri denebilir. Bu yaklaşım bir çok programlama dilinde farklı biçimlerde yer alabilir, anlaşılabilirlik açısından ilk önce Javascript örneği vermeyi tercih ettim.

1.3. Lambda Java 8 öncesinde nasıldı? Lambda birimleri (referans verilebilir iş birimleri), Java 8 evvelinde anonim sınıflar ile tanımlanabilmekteydi. Örnek 2’nin benzeri Java 8 evvelinde nasıl yazılıyordu? Öncelikle bir iş birimi tipi gerekli, bu iş birimi 2 argüman kabul etmeli ve bir değer döndürmelidir. İş mantığı anonim olarak tanımlanacağı için, abstract sınıflar veya arayüzler kullanılabilir. Örnek 3 public interface Anonim{ public int call(int a, int b); }

Anonim arayüz sözleşmesi, int türünden 2 değer alır ve bir int değer döndürür. Dikkat ederseniz sadece sözleşmenin maddesi tanımlandı, iş mantığı anonim olarak geliştirici tarafından tanımlanacak. public class LambdaApp { public static void main(String[] args) { LambdaApp app = new LambdaApp(); // Örnek 2 (1) gibi app.fonk(2, 3, new Anonim() {

2

Java 8 ve Lambda ifadeleri

@Override public int call(int a, int b) { return a + b; } }); } // Örnek 2 (2) gibi public int fonk(int a, int b, Anonim anonim) { return anonim.call(a, b) * 2; };

}

Anonim iş birimi burada tanımlanıyor Anonim iş birimi burada koşturuluyor

1.4. Java 8 ve Lambda ifadeleri LambdaApp sınıfının (1) numaralı kısmındaki anonim iş birimi, Javascript dilindeki karşılığına göre şu anda çok daha kompleks. 6 komut satırı yer işgal ediyor. Fakat bu fonksiyonun yaptığı tek iş var, 2 argüman almak ve toplayıp geri döndürmek. Bu anonim birimi sanıyorum şu biçimde temsil edebiliriz. fn(a,b) -> (a+b);

Görüldüğü üzere tek bir satırda aynı işi gören anonim iş birimini yani lambda ifadesini yazdık. Aynı örneği şimdi Java 8 Lambda deyimi ile yazalım. public interface Anonim{ public int call(int a, int b); } public class LambdaAppJava8 { public int fonk(int a, int b, Anonim anonim) { return anonim.call(a, b) * 2; }; public static void main(String[] args) {

3

Java 8 ve Lambda ifadeleri

LambdaAppJava8 app = new LambdaAppJava8(); app.fonk(2, 3, (a, b) -> a + b); // Dikkat (1) } }

Görüldüğü üzere 6 satırlık anonim sınıf kullanımını, tek satıra düşürmüş olduk. 1

Lambda ifadeleri, Java 8 versiyonunun en çarpıcı yeniliklerinden biri. (Bkz. Project Lambda ). Sizler de Java 8 kullanmak istiyorsanız https://jdk8.java.net/ adresinden sisteminize kurabilirsiniz. Bol Javalı günler dilerim.

1

4

http://openjdk.java.net/projects/lambda/

Bölüm 2. Lambda ifadeleri ve Fonksiyonel arayüzler Merhaba arkadaşlar; Bugün sizlerle fonksiyonel arayüzlerden ( Functional Interfaces ) ve Lambda ifadeleri (Lambda Expressions) ile olan ilişkisinden basetmek istiyorum.

2.1. Functional Interfaces Tek bir soyut metodu bulunan arayüzlere fonksiyonel arayüz denir. İki veya üç değil, yalnızca bir tane soyut metodu olmalı. Peki neden “1” dersek sebebinin Lambda ifadelerine dayandığını söylemek isterim. Örneğin; Şöyle bir Lambda ifademiz olsun; fn(x,y) -> 2*x + y

Bu Labmda deyimini örneğin Javascript gibi bir dil ile temsil etmek isteseydik şöyle yazabilirdik; function(x , y) { return 2*x+y; }

Peki fn(x,y) → 2*x + y Lambda ifadesini Java programlama dilinde nasıl yazabiliriz? Java 8 geliştirilirken, geliştirim takımı kendilerine bu soruyu sormuş ve yanıt olarak fonksiyonel arayüzler kullanarak ihtiyacı karşılamışlar. Şöyle ki; Bir Lambda ifadesi, Java derleyicisi tarafından, bir Java arayüzünün (tek bir soyut metodu olmalı) nesnel karşılığına (implementation) dönüştürülmektedir. Örneğin, fn(x,y) → 2*x + y Lambda ifadesi, aşağıdaki fonksiyonel arayüze dönüştürülebilirdir. Çünkü fonksiyon x ve y adında iki parametre almakta ve 2*x + y ile tek bir

5

Functional Interfaces

değer döndürmektedir. Tabi burada x ve y ’ nin tipleri ne? dersek, herhangi bir matematiksel tip olabilir. Biz burada sabit bir tip (int gibi) verebilir, veya jenerik tiplemeler de yapabiliriz. Fakat şu anlık bununla yetinelim. @FunctionalInterface // Opsiyonel interface Foo{ int apply(int x, int y); }

Şimdi bu Lamda ifadesini uygulamamızda kullanalım. Örnek 1: Lambda ifadeleri atama sırasında kullanılabilir. Foo foo = (x,y) -> (2*x+y); int sonuc = foo.apply(3,4); System.out.println("Sonuç: "+sonuc); // Çıktı: 10 // veya Foo foo = (x, y) -> Math.pow(x,y); int sonuc = foo.apply(3,2); System.out.println("Sonuç: "+sonuc); // Çıktı: 3*3 = 9

Örnek 2: Lambda ifadeleri, metod parametrelerinde de tanımlanabilir. class Bar{ public int calculate(Foo foo, int x, int y){ return foo.apply(x,y); } } Bar bar = new Bar();

6

Functional Interfaces

int sonuc = bar.calculate( (x,y) -> (2*x+y) , 3, 4 ); System.out.println("Sonuç: "+sonuc); // Çıktı: 10

Java programlama dilinde fonksiyon ifadesi pek kullanılmaz, onun yerine metod ifadesi kullanılır. Java metodları tek başına birer eleman değildir, diğer bir dil elemanının (sınıf, enum, interface ..) dahilinde tanımlanırlar. Javascript gibi dillerde ise fonksiyonlar tek başına birer elemandır, diğer bir dil elemanının içinde olmak zorunluluğu yoktur. Bu sebeple Java ortamında, bir Lambda ifadesinden bir fonksiyona/metoda/iş birimine dönüşüm için fonksiyonel arayüzler kullanılmaktadır. Tekrar görüşmek dileğiyle..

7

8

Bölüm 3. Tarih ve Saat işlemleri Java 8 içerisinde zaman temsili için yeni bir Date-Time API geliştirildi. Java programlama dilinde zamansal işlemler için JSR 310: Date and Time API şartnamesi yer almaktadır. Java 8 ile birlikte yeniden düzenlenen bu şartname, yepyeni özellikler sunmaktadır. Yeni geliştirilen Date-Time API’nin referans implementörü ThreeTen projesidir. Yeni Date-Time API ile kolay kullanım, anlaşılırlık, thread-safety gibi hususlarda iyileştirmeler karşımıza çıkıyor. Bu yeni API’ ye dair bileşenler (sınıf, arayüz, enum vs.) java.time paketi altında yer almaktadır. Şimdi sizlerle java.time paketi içerisinde yer alan bileşenler ile ilgili kolay anlaşılır örnekler paylaşmak istiyorum. java.time paketindeki sınıfların genel olarak kurucu metodu private erişim belirleyicisine sahiptir, bu sebeple new anahtar ifadesiyle oluşturulamazlar. Onun yerine now, of , from, parse gibi metodlarla yeni nesneler oluşturulabilmektedir. java.time paketi içerisindeki zamansal sınıflar immutable’ dir. Bu sebeple bir nesne oluşturulduktan sonra içerisindeki veriler kesinlikle düzenlenemezler. Bu da mevcut sınıfları thread-safety hale getirmektedir. ( Bkz. Thread safety & immutability). Bu yazımızda LocalDate , LocalTime , LocalDateTime , ZoneId ve ZonedDateTime sınıflarının kullanımını irdeleyeceğiz.

3.1. LocalDate LocalDate sınıfı ile tarihsel zaman temsil edilir. Örneğin: 10/10/2010 tarihini LocalDate ile temsil edebiliriz. Örnekler "of" metodu ile LocalDate nesnesi oluşturulabilir. LocalDate.of(1988, 07, 16); // 1988-07-16 LocalDate.of(1988, Month.JULY, 16) // 1988-07-16 (Month enum)

"now" metodu ile o anın tarihi elde edilir. LocalDate now = LocalDate.now(); // 2014-04-05

"with*" metodu ile eldeki bir LocalDate için gün, ay, yıl alanları düzenlenebilir. LocalDate sınıfı immutable ’dir. Bu sebeple with metodu farklı bir LocalDate nesne döndürür. O anki nesneyi düzenlemez.

9

LocalTime

LocalDate now = LocalDate.now(); // 2014-04-05 now.withYear(2016); // 2016-04-05 now.withMonth(8).withDayOfMonth(17); // 2014-08-17 now .with(ChronoField.YEAR, 2012) .with(ChronoField.MONTH_OF_YEAR, 8) .with(ChronoField.DAY_OF_MONTH,3); // 2012-08-03

"plus*" metodu ile eldeki bir LocalDate için gün, ay, yıl alanları artırılabilir. LocalDate sınıfı immutable’dir. Bu sebeple plus metodu farklı bir LocalDate nesne döndürür. O anki nesneyi düzenlemez. now .plusWeeks(2) .plusDays(3) .plusYears(3) .plusDays(7); // now .plus(2, ChronoUnit.WEEKS) .plus(3, ChronoUnit.YEARS) .plus(3, ChronoUnit.DECADES); //

"minus*" metodu ile eldeki bir LocalDate için gün , ay , yıl alanları azaltılabilir. LocalDate sınıfı immutable’dir. Bu sebeple minus metodu farklı bir LocalDate nesne döndürür. O anki nesneyi düzenlemez. now.minusDays(5).minusMonths(2); // now .minus(2, ChronoUnit.WEEKS) .minus(3, ChronoUnit.YEARS) .minus(33, ChronoUnit.DAYS); //

3.2. LocalTime LocalTime sınıfı ile saatsel zaman temsil edilir. Örneğin: 20:11 , 18:15:55 saatlerini LocalTime ile temsil edebiliriz. LocalTime ile saat, dakika, saniye, salise temsil edilebilir. Örnekler

10

LocalDateTime

LocalTime now= LocalTime.now(); LocalTime time= LocalTime.of(18, 20, 55); // 18:20:55 time.getHour(); // 18 time.getMinute(); // 20 time.getSecond(); // 55 LocalTime.NOON; // 12:00 LocalTime.MIDNIGHT; // 00:00 LocalTime.parse("10:05"); // 10:05 time .plusSeconds(45) .minusSeconds(5) .minus(5, ChronoUnit.SECONDS); // 18:20:35

3.3. LocalDateTime LocalDateTime sınıfı ile hem tarihsel hem saatsel zaman temsil edilir. Örneğin: 10/10/2010 15:22:33 zamanını LocalDateTime ile sınıfsal olarak temsil edebiliriz. Örnekler LocalDateTime now = LocalDateTime.now(); LocalDateTime dateTime = LocalDateTime.of(2014, Month.JANUARY, 3, 4, 5, 45); dateTime.getYear(); // 2014 dateTime.getMonth(); // JANUARY dateTime.getDayOfMonth(); // 3 dateTime.getHour(); // 4 dateTime.getMinute(); // 5 dateTime.getSecond(); // 45 // LocalDateTime2LocalDate ve LocalDateTime2LocalTime LocalDate date = dateTime.toLocalDate(); LocalTime time = dateTime.toLocalTime(); dateTime .minusDays(3) .plusYears(3) .plusMinutes(3)

11

ZoneId

.minusWeeks(5) .plusSeconds(2) .plus(3, ChronoUnit.DECADES) .minus(3, ChronoUnit.DECADES);

3.4. ZoneId ZoneId sınıfı, dünya üzerindeki saat dilimlerinin Java taraflı nesnel karşılığını temsil için oluşturulan yeni bir Java 8 bileşenidir. Java 8 için tüm saat dilimlerinin listelenmesi için ZoneId sınıfının getAvailableZoneIds metodu kullanılabilmektedir. Örneğin aşağıdaki kod, tüm saat dilimlerini sıralı olarak listelemektedir. Set zones = ZoneId.getAvailableZoneIds(); zones.stream().sorted().forEach(System.out::println);

… Africa/Abidjan Africa/Accra Africa/Addis_Ababa … America/Argentina/Tucuman America/Argentina/Ushuaia America/Aruba America/Asuncion … Asia/Istanbul Asia/Jakarta Asia/Jayapura … Etc/GMT+12 Etc/GMT+2 Etc/GMT+3 … Europe/Isle_of_Man Europe/Istanbul Europe/Jersey …

O anki çalışılan makinadaki saat dilimi için ZoneId sınıfının systemDefault metodu kullanılabilir.

12

ZonedDateTime

ZoneId.systemDefault(); // Europe/Athens

JVM varsayılan saat dilimini mevcut işletim sistemi üzerinden almaktadır. Eğer istenirse mevcut Java sanal makinesinin varsayılan saat dilimi -Duser.timezone= ifadesiyle düzenlenebilmektedir. -Duser.timezone=Europe/Istanbul

gibi.

3.5. ZonedDateTime ZonedDateTime sınıfı aslında saat dilimi katıştırılmış LocalDateTime sınıfıdır desek yeridir. LocalDateTime sınıfından farkı genel olarak temsil ettiği zamanı saat dilimi içerir olarak sunmasıdır. Örnekler ZonedDateTime.now(); /* 2014-04-05T16:33:16.320+03:00[Europe/Athens] */ ZoneId istanbul = ZoneId.of("Europe/Istanbul"); ZonedDateTime.now(istanbul); // 2014-04-05T16:33:16.330+03:00[Europe/Istanbul] // Japonyada tarih/saat kaç? ZonedDateTime.now(ZoneId.of("Japan")); // 2014-04-05T22:33:16.331+09:00[Japan]

Bir ZonedDateTime nesnesi LocalDateTime , karşılıklarına dönüştürülebilmektedir.

LocalDate

ve

LocalTime

LocalDateTime localDateTime = japan.toLocalDateTime(); /* 2014-04-05T22:33:16.331 */ LocalDate localDate = japan.toLocalDate(); // 2014-04-05 LocalTime localTime = japan.toLocalTime(); // 22:33:16.331

Kaynaklar [1] http://www.threeten.org/ [2] http://java.dzone.com/articles/introducing-new-date-and-time [3] http://docs.oracle.com/javase/tutorial/datetime/index.html

13

ZonedDateTime

Tekrar görüşmek dileğiyle..

14

Bölüm 4. Consumer Arayüzü Daha önceki yazılarımızda Lambda ifadelerinden ve Fonskiyonel arayüzlerden bahsetmiştik. Şimdi ise, java.util.function paketi altında yer alan ve gömülü olarak bulunan fonksiyonel arayüzlere değineceğiz. java.util.function paketi altında, farklı amaçlar için bulunan hazır arayüzler bulunmaktadır. Java 8 içerisinde Lambda deyimlerinin kullanılabilir kılınmasında, java.util.function paketi 1 altındaki arayüzler kullanılmaktadır. Bu fonksiyonel arayüzlere java.util.function adresinden görebilirsiniz. Bu yazımızda ise, fonksiyonel arayüzlere giriş düşüncesiyle java.util.function.Consumer arayüzünden ve nasıl kullanıldığından bahsedeceğiz. Consumer arayüzü accept isimli tek bir metoda sahiptir. Bu fonksiyonun bulunuş amacı, tüketim operasyonlarında kullanılmasıdır. Tüketimden kasıt edilen ise, metoda girdi olması fakat çıktı olmamasıdır. Metod girdisinin tipi ise jenerik olarak T harfi ile temsil edilmiştir. T yerine, isteğe göre herhangi bir Java tipi gelebilir. Biz String tipini kullanacağız. @FunctionalInterface public interface Consumer { void accept(T t); }

Consumer arayüzü, yukarıda görüldüğü üzere bir fonksiyonel arayüzdür. Bir arayüzün, fonksiyonel olarak nitelenebilmesi için, tek bir soyut metoda sahip olma şartı vardır. Zaten bu sayede, fonksiyonel arayüzler Lambda deyimlerine öykünebilmektedirler.

4.1. Java 8 öncesi Java 8 öncesine göre Consumer arayüzü türünden bir nesneyi anonim bir sınıf ile oluşturulım. Consumer consumer = new Consumer() { @Override public void accept(String msg) { System.out.println(msg); 1

http://docs.oracle.com/javase/8/docs/api/java/util/function/package-summary.html

15

Java 8 sonrası

} }; consumer.accept("Merhaba Dünya");

Görüldüğü üzere bir anonim sınıf oluşturduk ve accept metodunu tükettik.

4.2. Java 8 sonrası Java 8 sonrası için anonim fonksiyonlar yerine Lambda deyimlerini kullanabilmekteyiz. Örneğin yukarıdaki anonim sınıfı aşağıdaki yer alan Lambda deyimi ile yer değiştirebiliriz. Consumer consumer = (String msg) -> { System.out.println(msg); }; consumer.accept("Merhaba Dünya");

Lambda deyimlerinde odaklanması gereken nokta, fonksiyonel arayüzün tek metodunun sahip olduğu metod girdi tipi, sayısı,sırası ve metod çıktı tipidir. Bu sayede kod satırı olarak tasaruf edilmektedir.

4.3. Lambda deyimleri akıllıdır Lambda fonksiyonlarında tanımlanan metod girdi tanımlamalarında, istenirse tip tanımlamasından feragat edilebilir. Yani yukarıdaki Lambda deyimini aşağıdaki gibi yazabiliriz. Consumer consumer = (msg) -> { System.out.println(msg); }; consumer.accept("Merhaba Dünya");

Görüldüğü gibi, (String msg) tanımlamasını (msg) yapabildik. Sol tarafta zaten String tip bilgisi yer aldığından, compiler metod girdisinin tipini buradan elde edecektir. Tip tanımlamalarından feragat ettiğimiz gibi parantezden de kurtulabiliriz. Consumer consumer = e -> { System.out.println(e); };

16

Consumer arayüzü nerede kullanılıyor? consumer.accept("Merhaba Uranüs");

4.4. Consumer arayüzü nerede kullanılıyor? JDK 8 in çekirdeğinde java.util.function arayüzleri halihazırda kullanılmaktadır. Örneğin Iterable arayüzünün içerisinde forEach metodunda Consumer arayüzü kullanılmaktadır. public interface Iterable { ... default void forEach(Consumer
View more...

Comments

Copyright ©2017 KUPDF Inc.
SUPPORT KUPDF