- Stream API
- Lambda Expressions & Functional Interfaces
- Interfaceler için Default ve Static Metotlar
- Metot Referansları
- Optional
- Date & Time API
1. Stream API
Java 8 ile birlikte gelen en büyük yeniliklerden birisi Stream API’dır. Bize arrayler ve collectionlar üzerinde daha okunabilir kod yazmamızı sağlayan bir yapı sunar.
Array lerde ve collection larda .stream() ya da .parallelStream() yazarak stream API’ye erişebiliriz.
Stream<T> bir interfacedir. İçerisindeki tüm metotlara java.util.stream paketinin altında bulunan Stream interface ine göz atarak erişebilirsiniz.
Sıkça kullanılan bazı metotlar şunlardır:
– filter
– map
– sorted
– forEach
– toArray
– collect
– min
– max
– count
– findFirst
– findAny
2. Lambda Expressions & Functional Interfaces
Java 8 ile birlikte gelen bir diğer önemli yenilik de Lambda Expression lar ve Fonksiyonel interface lerdir. Bu yenilik ile beraber artık daha okunaklı ve anlaşılır kodların yazılabilmesi sağlanmaktadır.
Functional interface ler, içinde sadece bir tane abstract metot içeren interface lerdir ve bir lambda expression ın tipi her zaman bir funtional interface olmak zorundadır. Bildiğimiz gibi, bir interface in implementasyonu normalde bu interface i implemente ederek yapılabilirken, aynı zamanda anonymous class kullanılarak da yapılabilir. Fakat bu yazım tarzının hem kötü bir görüntüsü vardır hem de okunabilirliği düşüktür. Lambda expression lar sayesinde hem daha az kod yazarız hem de okunabilirliği oldukça arttırırız.
Peki bir lambda expression nasıl yazılır?
(parametreler) -> {yapılacaklar}
(parametreler): Burada kaç tane parametre geçilecekse, bunlar tanımlanır. Hiç parametre geçilmeyecekse () şeklinde yazılabilir.
-> : Eğer doğrudan bir metot referansı kullanılmazsa ok zorunludur.
{yapılacaklar} : Burada da yapılacak işlemi belirtiriz. Tek satır kod yazılacaksa süslü parantezler yazılmayabilir.
3. Interfaceler için Default ve Static Metotlar
Java 8 den önce interface ler sadece soyut metotlar içerebiliyordu fakat Java 8 ile birlikte artık interface ler içine statik ya da default metotlar tanımlanabiliyor.
Default metodun amacı aslında interface lere yeni metotlar eklemenin daha kolay olabilimesi. Default bir metot override edilmezse, interface içinde tanımlandığı şekliyle kullanılır fakat istenildiği durumda override edilebilir. Bu da sadece gerekli yerlerde override edilerek, yeni metotların daha kolay eklenilebilmesine yardımcı olur.
Statik metotlar ise override edilemezler. Bu interface i implemente eden tüm classların bu metodu, interface içindeki hali ile kullanılmasını garanti eder.
4. Metot Referansları
Java 8 ile gelen bir diğer yenilik ise metot referanslarıdır.
Bir nesne üzerindeki metodun referansı “::” yardımı ile alınabilir ve bu referans yardımı ile de başka yerlerde kullanılabilir.
Lambda expressionlar ile birlikte sıklıkla kullanılır.
5. Optional
Java’da belki de en çok karşılaşılan hata “NullPointerException” hatasıdır. Yazılımcılar genellikle bu hatadan kaçınmak için bir çok null kontrolü yaparlar ve bu da kodun daha kötü görünmesine neden olur.
Java 8 ile birlikte Optional kavramı hayatımıza girmiştir. Eğer değer null ise daha önceden tanımlanmış bazı işlemleri kolay bir şekilde yaptırabilir ya da null kontrollerinizi daha okunabilir bir şekilde yapabilirsiniz.
6. Date & Time API
Java 8 ile birlikte gelen yeniliklerden birisi de java.time paketidir. java.util.date paketinde bulunan Date sınıfının kullanımı gerçekten zor ve karmaşık bir yapı sunuyordu. Basitçe bir tarih oluşturmak bile gerçekten çok karmaşıktı. Çünkü yıllar 1900’den ve aylar 0’dan başlıyordu.
java.time paketi ile birlikte LocalDate, LocalTime, LocalDateTime gibi çok kullanışlı sınıflar gelmiştir.