2 Eylül 2017 Cumartesi

Java 8 Functional Interfaces ve Lambda Kullanımı

Java 8'de tek metoda sahip interface'lere functional interfaceler denir. Bunlar Runable interface'i gibi built in interfaceler olabildiği gibi kendi yazdığımız interface'ler de olabilir.




Java 8 ve öncesinde bir interface'i implemente etmek için bir class yazıp metodlarını override ediyorduk.
public interface SimpleInterface {
     public void doSomething();
}
public class SimpleClass implements SimpleInterface{
     
     @Override
     public void doSomething(){
        System.out.println("doing something");
    }

}
public class Test {
    
    public static void main(String[] args) {
        SimpleClass sipmle=new SimpleClass();
        simple.doSomething()
    }

}
Görüldüğü gibi interface'i implemente eden bir sınıf yazdık ve metodunu kullandık. Eğer inner class kullansaydık :
public class Test {
    
      public static void main(String[] args) {
          SimpleInterface simple= new SimpleInterface(){
          
             @Override
             public void doSomething(){
                 System.out.println("doing something");
             }

          }
         simple.doSomething();
    }

}
şeklinde Class yazmamıza gerek kalmadan interface'i direkt kullanadabilirdik. Java 8'de lamda ile bu daha da kolaylaşıyor. Eğer interface functional interface ise yani tek abstract metoda sahipse : Görüldüğü gibi tek abstract metodlu bir interface. @FunctionalInterface anatosyonu yazma zorunluluğumuz yoktur isteğe bağlıdır.
@FunctionalInterface
public interface SimpleInterface {
    public void doSomething();

}
public class Test {

    public static void main(String[] args) {
        SimpleInterface simple=()->System.out.println("doing something");
        simple.doSomething();    
    }

}
Burada "()" interface'in sahip olduğu tek methodu belirtir. -> ise implementasyonuna işaret eder. Burada implementasyon System.out.println("doing something"); şeklindedir. Bu şekilde functional interface'i class ile implemente etmeye gerek kalmadan metdounu istediğimiz yerde farklı implemnte ederek kullanabiliriz. Aynı durum tek metoda sahip built-in interfacelerde de geçerlidir. Örneğin Runable interface'i :
public class UseRunnable {

    public static void main(String[] args) {

        Runnable r1 = () -> { 
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("Running Thread 1");
        };
        Runnable r2 = () -> System.out.println("Running Thread 2");

        new Thread(r1).start();
        new Thread(r2).start();

    }

}

0 yorum: