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(); } }