추상메소드를 하나만 가지고 있는 인터페이스
@FunctionalInterface
public interface RunSomething {
void doIt();
static void printName() {
System.out.println("욱상");
}
default void printAge() {
System.out.println("20");
}
}
...
/*
익명클래스로 선언해서 사용하지 않고 간단한 표현식으로 추상메소드를 Override하여 사용할 수 있다.
익명클래스로 선언하여 사용하는것과 내부적으로 코드는 같음
*/
public static void main(String[] args) {
RunSomething runSomething = () -> {
System.out.println("doIt");
};
}
SAM (Single Abstract Method) 인터페이스라고 한다.
‘@FunctionalInterface’ 어노테이션으로 사용한다.
Java가 기본으로 제공하는 함수형 인터페이스
Function<T, R>
public class Plus10 implements Function<Integer, Integer> {
@Override
public Integer apply(Integer integer) {
return integer + 10;
}
}
...
Function<Integer, Integer> plus10 = (i) -> i + 10;
Function<Integer, Integer> multiply2 = (i) -> i*2;
/*
Function 인터페이스의 default method인 compose를 사용하여
함수의 인자로 함수를 넘겨줄 수 있다.
*/
Function<Integer, Integer> multiply2AndPlus10 = plus10.compose(multiply2);
multiply2AndPlus10.apply(10); // 30
/*
Function 인터페이스의 default method인 andThen.
이 경우에는 10을 먼저 더하고 그 후 곱하기 2를 수행한다.
*/
Function<Integer, Integer> plus10AndThenMultiply2 = plus10.andThen(multiply2);
System.out.println(plus10AndThenMultiply2.apply(10)); // 40
BiFunction<T, U, R>
Consumer<T>
Consumer<Integer> consumer = (i) -> System.out.println(i);
consumer.accept(10); // 10
Supplier<T>
Supplier<Integer> supplier = () -> 10;
supplier.get(); // 10
Predicate<T>
Predicate<String> predicate = (s) -> s.equals("wooksang");
predicate.test("wooksang"); // true
UnaryOperator<T>
BinaryOperator<T>