Java Functional Interfaces
Functional Interface ler Java 8 ile tanıtıldı. Java’da içerisinde sadece bir tane abstract method olan interfaceler Functional Interface olarak adlandırılır. Genellikle lambda expression lar ile kullanılırlar. Functional Interface ler tanımlanırken @FunctionalInterface anotasyonu kullanılması önerilir.
@FunctionalInterface
public interface MyFunctionalInterface {
void execute();
}
Ancak kullanmak zorunda olmadığımızı da belirtmemiz gerekir.
public interface MyFunctionalInterface {
void execute();
}
@FunctionalInterface anotasyonu, o interface in bir Functional Interface olduğunu net bir şekilde gösterir. Aynı zamanda interface i Functional Interface olması için gereken koşulları sağlamaya zorlamaktadır. Sağlamadığı durumda derleyicinin hata oluşturmasını sağlar.
Yukarıdaki interface birden fazla abstract method içerdiğinden Functional Interface olma koşullarını sağlamamaktadır. Bu nedenle derleyici hata vermektedir.
Eğer @FunctionalInterface anotasyonu eklenmemiş olsaydı derleyici hata oluşturmayacaktı.
Functional Interface:
- sadece bir tane abstract method içermelidir.
- n tane default method içerebilir.
- n tane static method içerebilir.
Aşağıda default ve static method(lar) içeren bir Function Interface tanımlanmıştır.
@FunctionalInterface
public interface MyFunctionalInterface {
void execute();
default void defaultMethod() {
System.out.println("default method");
}
static void staticMethod() {
System.out.println("static method");
}
}
JDK da Tanımlı Functional Interface’ler
Aşağıda JDK içerisinde java.util.function package altında bulunan genel ihtiyaçlara hizmet edebilecek Functional Interface ler gösterilmiştir.
Supplier<T>: Parametre almaz, geri değer döner.
Consumer<T>: T tipinde tek parametre alır, geriye değer dönmez.
BiConsumer<T,U>: T ve U tipinde iki parametre alır, geriye değer dönmez.
Predicate<T>: T tipinde tek parametre alır geriye boolean değer döner.
BiPredicate<T,U>: T ve U tipinde iki parametre alır, geriye boolean değer döner.
Function<T,R>: T tipinde bir parametre alır, geriye R tipinde değer döner. Predicate ile farkı, Predicate boolean döner.
BiFunction<T,U,R>: T ve U tipinde iki parametre alır, geriye R tipinde değer döner. BiPredicate ile farkı, BiPredicate boolean döner.
UnaryOperator<T>: T tipinde bir parametre alır, T tipinde değer döner. Function ın özel bir halidir.
BinaryOperator<T>: Aynı T tipinde iki parametre alır, T tipinde değer döner. BinaryOperator BiFunction ın özel halidir.