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