
Java 8 Optional Yeniliği
Bir Java geliştiricisinin korkulu rüyası NullPointerException istisnalarıyla uğraşmaktır. null değer ile karşılaşmak, ona karşı önlem almak herzaman için can sıkıcı olmuştur. Bu can sıkıcılığı ortadan kaldırmak için Java 8 içerisinde Optional sınıfı getirilmiştir. Optional yapısı daha evvelden farklı dil ortamlarında bulunan bir özelliktir.
Optional türünden nesneler, null olma ihtimali olan alanları kolay yönetmek için oluşturulmuştur.
Optional Oluşturmak
Bir Optional nesnesi, Optional sınıfının çeşitli statik metodlarıyla oluşturulmaktadır. Bunlar empty, of ve ofNullable ‘dir.
- empty
- Taze bir
Optionalnesnesi oluşturur. - of
- Bir nesneyi
Optinalile sarmalar. Parametre olaraknulldeğer kabul etmez. - ofNullable
- Bir nesneyi
Optinalile sarmalar. Parametre olaraknulldeğer kabul eder.
Örneğin
Optional<Double> empty = Optional.empty(); (1)
Optional<String> of = Optional.of("Merhaba Dünya"); (2)
Optional<String> ofNull = Optional.of(null); (3)
Optional<Integer> ofNullable = Optional.ofNullable(null); (4)
- Değer içermeyen Opt
- String türünden değer içeren Opt
Optional#ofnullkabul etmez. İstisna fırlatır.Optional#ofNullablenullkabul eder. İstisna fırlatmaz.
#ifPresent – Varsa yap, yoksa yapma
Eğer bir Optional içerisinde sadece veri varsa (null değilse) bir işin yapılması isteniyorsa #ifPresent metodu kullanılabilir. #ifPresent metodu Consumer<T> fonksiyonel arayüzü türünden bir nesne kabul etmektedir.
Örneğin bir sayının karesini almaya çalışalım. Kullanılan değişken null değerini referans ediyorsa NullPointerException istisnası alınacaktır.
Integer numara = null;
Double karesi = Math.pow(numara , 2); (1)
System.out.println("Sonuç: " + karesi);
- Exception in thread “main”
java.lang.NullPointerException
Bu istisna için if deyimiyle karşı önlem alınabilir.
Integer numara = null;
if(numara != null) {
Double karesi = Math.pow(numara , 2);
System.out.println("Sonuç: " + karesi);
}
Fakat if deyimiyle birlikte ! , == , != ifadelerini kullanmak akıcı bir geliştirim deneyimi sunmaz. Ayrıca bu durum hata yapılmasına daha açıktır. Bunun yerine Optional#ifPresent metodunu kullanabiliriz.
Integer numara = null;
Optional<Integer> opt = Optional.ofNullable(numara);
opt.ifPresent(num -> {
Double karesi = Math.pow(num , 2);
System.out.println("Sonuç: " + karesi);
});
#map – Dönüştürme
Optional nesnelerinin sarmaladığı veriler üzerinde dönüştürüm yapılabilmektedir. Bir önceki örneği bu şekilde yeniden yazabiliriz.
Integer numara = null;
Optional<Integer> opt = Optional.ofNullable(numara);
opt
.map(num->Math.pow(num,2))
.ifPresent(System.out::println);
#filter – Filtreleme
Optional nesnelerinin sarmaladığı veriler üzerinde süzme işlemi de yapılabilmektedir.
Örneğin aşağıdaki kod parçası yerine;
String message = null;
if (message != null)
if (message.length() > 5)
System.out.println(message);
Aşağıdaki Optional karşılığını kullanabiliriz.
String message = null;
Optional<String> opt = Optional.ofNullable(message);
opt
.filter(m -> m.length() > 5)
.ifPresent(System.out::println);
#orElse – Varsa al, yoksa bunu al
orElse metodu daha çok ternary (üçlü) şart ihtiyacı olduğu durumlarda ihtiyaç duyulabilir. Daha akıcı bir geliştirim deneyimi sunar.
null değilse numarayı döndür, null ise 0 döndür.Integer numara = null;
int result = (numara != null) ? numara : 0;
Yukarıdaki üçlü şartı orElse ile birlikte kullanabiliriz.
Integer numara = null;
Optional<Integer> opt = Optional.ofNullable(numara);
int result = opt.orElse(0);
#orElseGet – Varsa al, yoksa üret
Bu metod orElse metoduna çok benzer, fakat orElseGet metod parametresi olarak Supplier fonksiyonel arayüzü türünden nesne kabul eder.
List<String> names = Arrays.asList("Ali","Veli","Selami");
Optional<List<String>> opt = Optional.ofNullable(names);
names = opt.orElseGet(()-> new ArrayList()); (1)
names = opt.orElseGet(ArrayList::new); (2)
- Lambda ile
- Metod referans ile
#orElseThrow – Varsa al, yoksa fırlat
Optional nesnesi bir değeri içeriyorsa (null olmayan) o değeri döndürür, null ise de sağlanan istisna nesnesini fırlatır. orElseThrow metodu Supplier türünden bir nesne kabul eder.
Integer numara = null;
Optional<Integer> opt = Optional.ofNullable(numara);
int result = opt.orElseThrow(RuntimeException::new); (1)
- Varsa döndürür, yoksa yeni bir
RuntimeExceptionistisnası fırlatır.
Java 8 yeniliklerini Java 8 Ebook ile öğrenebilirsiniz.
Tekrar görüşmek dileğiyle.




1 Comment