자바 8에서 도입된 함수형 인터페이스란, @FuntionalInterface를 인터페이스에 명명함으로써 생성할 수 있다.
함수형 인터페이스는 추상 메소드가 반드시 1개 작성해야하며, 추상 메소드를 0개 또는 2개이상 선언할 경우 컴파일러가 체크하여 에러를 발생시킨다.
추상메소드 외 default 메소드 또는 static 메소드는 선언 가능하다.
함수형 인터페이스는 크게 5가지로 Predicate, Consumer , Supplier , Function , Comparator 존재한다.
@FunctionalInterface
interface Calculator{
int method(int a, int b);
}
public class Main {
public static void main(String[] args) {
Calculator sum = (x,y) -> {
return x+y;
};
Calculator sub = (x,y) -> {
return x-y;
};
Calculator multi = (x,y) -> {
return x*y;
};
System.out.println(sum.method(10,20)); //30
System.out.println(sub.method(30,5)); //25
System.out.println(multi.method(10, 10)); //100
}
}
람다식을 이용하여 함수형 인터페이스를 구현할 수 있다.
구현 후 인터페이스내에 존재하는 메서드는 람다로 구현한 방법에 의해 메서드가 동작한다.
Predicate의 test() 메서드는 인자를 받고 boolean을 리턴해준다.
@FunctionalInterface
public interface Predicate<T> {
boolean test(T t);
// abstract 메서드는 항상 1개여야한다.
// abstract test()메서드 외 여러가지 default 메서드와 static메서드가 존재한다.
// T -> boolean
}
Consumer의 accept() 메서드는 인자를 받고 리턴값이 없다.
@FunctionalInterface
interface Consumer{
void accept(T t);
// T -> void
}
Supplier의 get() 메서드는 인자를 받지 않지만, T 타입 객체를 리턴한다.
@FunctionalInterface
public interface Supplier<T> {
/**
* Gets a result.
* @return a result
*/
T get();
// () -> T
Function의 apply() 메서드는 T 타입 객체를 인자로 받고 R 타입 객체를 리턴한다.
@FunctionalInterface
public interface Function<T, R> {
/**
* Applies this function to the given argument.
* @param t the function argument
* @return the function result
*/
R apply(T t);
// T -> R
Comparator compare() 메서드는 T 타입 객체를 인자로 받고, 두 인자를 비교한다.
o1<o2 : 음수, o1==o2 : 0, o1>o2 : 양수
/**
* Params:
* o1 – the first object to be compared. o2 – the second object to be compared.
*
* Returns:
* a negative integer, zero, or a positive integer
* as the first argument is less *than, equal to, or greater than the second.
*/
@FunctionalInterface
interface Comparator{
int compare(T o1, T o2);
// (T,T) -> int
}