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.
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
Optional
nesnesi oluşturur. - of
-
Bir nesneyi
Optinal
ile sarmalar. Parametre olaraknull
değer kabul etmez. - ofNullable
-
Bir nesneyi
Optinal
ile sarmalar. Parametre olaraknull
değ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#of
null
kabul etmez. İstisna fırlatır. -
Optional#ofNullable
null
kabul eder. İstisna fırlatmaz.
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);
});
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);
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
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);
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
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
RuntimeException
istisnası fırlatır.
Java 8 yeniliklerini Java 8 Ebook ile öğrenebilirsiniz.
Tekrar görüşmek dileğiyle.