Nedir bu Optional?

Her yazılımcının yazılım hayatı boyunca en çok karşılaştığı exceptionlardan biri olan NullPointerException Java 8 ile artık önlenebilir hale gelmiştir.

Bu yazıda Java 8’in yeni özelliklerden biri olan java.util.Optional sınıfını inceleyeceğiz. Optional sınıfı içerisinde toplamda 15 adet method bulundurmaktadır.Bu methodlar ile NullPointerException ın nasıl önleneceğini örnekler ile anlatmaya çalışacağım.

of : Bu method Optional türde olmayan herhangi bir nesneyi Optional türe çevirmek için kullanılır. Tabiki bu nesneye bir değer atanmış olması gerekmektedir. Eğer NullPointerException almak istiyor isek of methodunun içerisine null değerini vermemiz yeterlidir. Örnek olarak ;

    Optional<String> chuck = Optional.of("Chuck Norris");

ofNullable : Bu method Optional türde olmayan herhangi bir nesneyi Optional türe çevirmek için kullanılır. Adındanda anlaşıldığı üzre atanan değer null olabilir.of methodundan ayrı olarak null değeri verdiğimiz zaman NullPointerException değilde NoSuchElementException ile karşılaşırız.

get : Bu method Optional sınıfı içerisinde oluşturulmuş olan T tipindeki nesneye erişmek için kullanırız. Örnek olarak yukarıda oluşturduğumuz chuck nesnesini yazdırmak istediğimiz zaman aşağıdaki şekilde yazdırabiliriz.

    System.out.println(chuck.get());

empty : Bu method bize boş bir Optional nesnesi üretmemizi sağlar. Kullanımı

    Optional<String> chuck = Optional.empty();

şeklindedir. Tabiki Optional türde bir objenin T tipine erişebilmek için get() methodu kullanılır. Empty yani boş oluşturulan bir Optional nesnesini get etmek istersek NoSuchElementException ile karşılaşırız. Sebebi nesneye henüz bir değer atanmamış olmasıdır.

ifPresent : Bu method Optional türde olan bir nesne için eğer tanımlı ise içerisinde işlem yapılmasına izin verir. Örnek olarak ;

    List<String> list = new ArrayList<>();
    list.add("Chuck Norris");
    list.add("Arif Pehlivan");
    list.add("Mario Jardel");
    Optional<List<String>> optList = Optional.of(list);
    optList.ifPresent(System.out::println);

isPresent : Bu method Optional türde olan bir nesnenin tanımlı olup olmadığını kontrol etmemizi sağlar. Eğer tanımlı ise true değil ise false değeri döner. Örnek olarak ;

    Optional<String> chuck = Optional.of("Chuck Norris");
    System.out.println(chuck.isPresent() ? "Chuck" : "Norris");

map : Bu method Optional türde tanımlı olan bir nesne üzerinde işlemler yapmamıza olanak sağlar. Örnek olarak ;

    Optional<String> test = Optional.of("Arif Pehlivan");
    test.map(String::length);

yada

    List<String> list = new ArrayList<>();
    list.add("Chuck Norris");
    list.add("Arif Pehlivan");
    list.add("Mario Jardel");
    Optional<List<String>> optList = Optional.of(list);
    optList.map(List::size).get();

filter : Bu method Optional türde tanımlı olan bir nesne üzerinde işlemler yapmamıza olanak sağlar. Örnek olarak ;

Optional<String> chuck = Optional.of("Chuck Norris");
    chuck.filter(i -> "Chuck Norris".equals(i)).ifPresent(System.out::println);

orElse : Bu method Optional türde oluşturulan nesne tanımlı olup olmasına bakmaksızın verilen değerini döner. Örnek olarak ;

    Optional<String> chuck = Optional.of("Chuck Norris");
    System.out.println(chuck.orElse(testOrElse()));
    private static String testOrElse(){
        System.out.println("Dur yapma");
    }

Bu örnekde sistem çıktısına önce Dur yapma değerini ardından Chuck Norris değerini dönecektir.

orElseGet : Yukarıdaki orElse methodundan farklı olarak orElse içerisindeki değer Optional’ın empty olup olmasına bakmaksızın direk çalışır. orElseGet ise Optional empty ise çalışır.

orElseThrow : Bu method Optional türde oluşturulan bir nesne için gerekli durumda exception fırlatır. Örnek olarak ;

    Optional<String> str = Optional.empty();
    System.out.println(str.orElseThrow(IllegalArgumentException::new));

Yukarıda Optional sınıfının sağlamış olduğu kolaylıkları anlatmaya çalıştım. Daha detaylı bilgi almak isterseniz bu linkden inceleyebilirsiniz.

Kolay Gelsin.. 🤞