Bir önceki bölümde Java 8 ile gelen Stream arayüzünde ve en çok kullanılan metodlarından bahsetmiştik. Bu bölümde ise null olması muhtemel olan alanların yönetimini kolaylaştırmak amacıyla oluşturulmuş Optional sınıfından, zaman ve tarih işlemlerini daha basit şekilde yapabilmek adına oluşturulmuş LocalDate ve LocalTime gibi Java 8 ile gelen Date-Time API‘ından bahseceğiz.
1. Optional Sınıfı
Null değer ile uğraşmak, kontrolünü yapmak her geliştirici için zor bir meseledir. Java 8 ile gelen Optional sınıfı bu sorunu çözmek ve kolay bir şekilde yönetimini yapmak için geliştirilmiştir.
Optional Nesnesi Oluşturma Yöntemleri
Optional özelliğine sahip nesne üç farklı yol ile elde edilebilir.
- empty metodu yardımıyla Optional tipte boş bir nesne oluşturabiliriz.
- Optional tipe dönüştürüp null değer almasına engel olabiliriz. (of)
- Optional tipe dönüştürüp null değer alabileceğine karar verebiliriz. (ofNullable)
Kod üzerinde inceleyelim.
Optional Nesnesi Üzerinde Çeşitli İşlemler Yapabileceğimiz Metodlar
get() metodu
Optional nesnesi içerisinde var olan değeri almak için kullanılır. Kullanırken dikkat edilmesi gerekir. Eğer Optional nesnesi boş ise ve get metodu kullanıldıysa NoSuchElementException hatası ile karşılaşılır. Bu hatanın önüne geçmek için isPresent metodu ile Optional nesnesinin boş olup olmadığı kontrol edilebilir.
isPresent() metodu
Optional nesnemizin null olup olmadığını kontrol etmek için kullanılır. Eğer null ise false, null değil ise true dönecektir.
ifPresent() metodu
Optional nesnemizin null olmadığı durumlarda bir iş yapmak istiyorsak kullanırız. Bu metot Consumer fonksiyonel arayüzü türünden bir nesne beklemektedir.
orElse() metodu
Optional nesnemiz herhangi bir değer içermediği durumda ( null olduğu durumda ) bir değer atayabiliriz.
orElseGet() metodu
orElse() metoduna benzemektedir tek farkı parametre olarak Supplier fonksiyonel arayüzünden bir nesne beklemektedir.
orElseThrow() metodu
Optional nesnemizin içerisinde eğer bir değer varsa o değeri geri döner, ancak eğer içerisinde bir değer yoksa yani null ise bu sefer bizim belirlemiş olduğumuz bir hatayı fırlatır.
map() ve filter() metodu
Optional türünde olan bir nesnemizi Stream konusunda işlemiş olduğumuz map metodunu ve filter metodunu kullanabiliriz. Bu sayede Optional türdeki bir nesneyi hem dönüştürme hemde süzme/filtreleme işlemine sokmuş oluruz.
Kod üzerinde metodları kısa kısa inceleyelim.
2. Date&Time API
Java 8 ile birlikte Tarih ve Saat işlemlerini daha kolay bir şekilde gerçekleştirmek üzere Date&Time API geldi. Bu sayede eskiden kullanılan java.util.Date ve java.util.Calendar sınıflarının dezavantajları ortadan kalkmış oldu. Bu eski sınıfların dezavantajı thread-safe yapıda olmaması ve bu nedenle eş zamanlılık probleminin doğabilmekte. Thread-safe nedir diye kısaca anlatmak gerekirse; birden fazla Thread’in bir kaynağa erişmek istemesiyle Thread’lerin deadlock olmadan yani birbirlerini kilitlemeden işlerini sonlandırması işlemine verilen isimdir. Java’da immutable sınıflar thread safe özelliği gösterir.
Yeni gelen Date&Time API bizlere java.time paketinin altında LocalDate, LocalTime, LocalDateTime, ZoneId ve ZonedDateTime sınıflarını kazandırdı. Bunları sırasıyla görelim.
LocalDate
Bu sınıf yalnızca gün, ay ve yıl bilgisi ile ilgilenir. İçerisinde barındırdığı of, now, with, plus gibi metodlarla oldukça kullanışlı işler çıkarmamızı sağlar. Kod üzerinde incelemek bizim için avantajlı bir seçenek olacaktır.
LocalTime
Bu sınıf ise sadece zaman ile ilgilenir. Zaman derken saat, dakika, saniye ve salise gibi kavramlardan bahsediyorum. Kod üzerinde inceleyelim.
LocalDateTime
Bu sınıf LocalDate ve LocalTime sınıflarının birleşimi olarak düşünebilir. Hem tarihe hemde zamana ihtiyacımız olduğu durumlarda kullanılır. İnceleyelim.
ZoneId ve ZonedDateTime
ZoneId sınıfı ile farklı saat dilimleri (Europa/Istanbul, America/Los_Angeles gibi ) ile çalışıldığında kullanılır. ZonedDateTime ise LocalDateTime gibi çalışır ancak farklı olarak içerisinde zaman dilimini barındırır. İnceleyelim.
Period ve Duration
Period ve Duration sınıfları iki tarih arasında veya iki zaman arasındaki farkla ilgilenir. Period tarihler arasındaki farkla, Duration ise zamanlar(saat, dakika) arasındaki farkla ilgilenmekte. Kod üzerinde inceleyelim.
Temporal Adjusters
İhtiyaca yönelik oluşturulmuş bu sınıf ile “Ayın ilk pazarı”, “Gelecek Perşembe” veya “Ayın Son Günü” gibi tarihleri elde edebiliriz. İnceleyelim.
Elbette ki Date&Time API bu sınıflarla sınırlı değil. Ancak en çok kullanılan, kullanılmaya elverişli sınıflar bunlardır. Sizler anlatmış olduğum sınıflara daha detaylı bakmak ya da var olan diğer sınıflara buradan göz atabilirsiniz.
Yazımı burada sonlandırıyorum. Optional sınıfından ve Date&Time API‘ından bahsetmeye çalıştım. Toplam 4 bölümden oluşan Java 8 Yenilikleri ile alakalı anlatacaklarımın sonuna gelmiş bulunmaktayım. Yazılarımın içerisinde bulunan tüm kodları sizler için tek bir repoda topladım. Github üzerinden hepsine erişebilir, pull request istekleri gönderebilirsiniz. Her son, yeni bir başlangıçtır diyerek herkese iyi çalışmalar diliyorum 🙂
Dipnot: Anlatımlarım içerisinde hatalı olan yerler olabilir, (umarım yoktur 🙄 ) şayet farkederseniz mail ya da yorum yoluyla ulaşabilir diğer insanlarında yanlış bilgilenmesini önleyebiliriz. Şimdiden teşekkür ederim. 🙏
Kaynaklar
- https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html
- https://kodedu.com/java-8-ebook/
- http://www.bahadirakin.com/optional-kullanmaya-baslamak/
- https://medium.com/@mrpehlivan/nedir-bu-optional-861f5bededb9
- http://koraypeker.com/2018/10/19/java-8-optional-sinifi/
- https://okanuzun.com/java-optional-sinifi/
- https://docs.oracle.com/javase/8/docs/api/java/time/package-summary.html
- https://www.oracle.com/technetwork/articles/java/jf14-date-time-2125367.html
- https://www.mobilhanem.com/java-8-date-api-ile-gelen-yenilikler/
- http://koraypeker.com/2018/12/09/java-8-date-time-api/