Java Util Function vs Metot Functionlar

Posted by dogukanhan on May 11, 2019 · 2 mins read

Yazı serisi boyunca çoğu function’a değindim aslında, bunların hepsi birer metot olarak’da yazılabilirdi. Bu yazı boyunca neden Java Util Function paketinin oluşturulduğunu anlatmaya çalışacağım.

Öncelikle ufak bir örnekle nasıl benzerlik gösterdiklerine değinelim.

public static boolean ciftMi(int x) {
    return x % 2 == 0;
}

public static void main(String[] args) {
    Predicate < Integer > ciftMe = (x) - > x % 2 == 0;
}

Bu iki fonksiyon görüldüğü üzere birbirinin aynısı işi yapmaktadır, yani sayının çift olup olmadığını kontrol eder. İlk fonksiyon bir metot olarak yazılmıştır. İkincisi ise lambda kullanılarak functional interface olan Predicate kullanılarak yazılmıştır.

ciftMi(30);
ciftMe.test(30);

Bu iki çağırma yöntemini ele alırsak ilkinin birinciye oranla daha yavaş çalışacağını söyleyebiliriz. Fakat ikincisinin ilkine oranla bir nesne üzerinden çağrıldığına dikkat çekelim. Burada aslında bizim sayının çift olup olmadığını kontrol eden bir nesnemiz var.

Nesneler java dili içerisinde metotlara parametere olarak gönderilebiliyor. Yani ikinci fonksiyonumuz nesne olduğundan dolayı bir metota parametre olarak gönderebiliriz. Buradan çıkartacağımız sonuç, bir metota fonkisyon gönderebiliyor olduğumuzdur.

public static void uygunsaYazdir(Predicate < Integer > fonk, int x) {
    if (fonk.test(x)) {
        System.out.println(x);
    }
}

public static void main(String[] args) {
    Predicate < Integer > ciftMi = (x) - > x % 2 == 0;
    uygunsaYazdir(ciftMi, 3);
    uygunsaYazdir(ciftMi, 6);
    uygunsaYazdir(ciftMi, 7);
    Predicate < Integer > tekmi = ciftMi.negate();
    uygunsaYazdir(tekmi, 1);
    uygunsaYazdir(tekmi, 11);
    uygunsaYazdir(tekmi, 12);

}

Yukarıdaki uygusaYazdir metotumuzu incelediğimizde parametre olarak nesne almasına karşın aslında bu nesne bir fonksiyon. Yani aslında bu metotumuz farklı fonksiyonlara göre farklı şekillerde çalışabilir.

Örnekte verildiği gibi çiftmi fonksiyonu parametre olarak gönderilirse, çift sayıları ekrana yazan bir metot, tekmi gönderilir ise tek sayıları yazan bir metot haline gelicektir.

Bunun gibi fonksiyonlar üzerinde bir çok işlem yapabiliriz çünkü bunlar artık birer nesnelerdir. Fonksiyonel programlamanın amacıda budur aslında, fonksiyonlarımızın sabit olması değil dinamik olmasıdır.