대표적인 함수형 인터페이스
T 타입을 받아서 R 타입을 리턴하는 함수형 인터페이스
// Function<T,R>
Function<Integer, Integer> plus10 = (i) -> i + 10;
Function<Integer, Integer> multiply2 = (i) -> i * 2;
plus10.andThen(multiply2).apply(2); // (10 + 2) * 2 = 24
plus10.compose(multiply2).apply(2); // (2 * 2) + 10 = 14
apply()를 통해 매개변수 전달 가능
default 메소드 andThen(), compose()
// BiFunction<T,U,R>
BiFunction<Integer, Integer, Integer> addTwoInt = (a, b) -> a + b;
int res = addTwoInt.apply(10,15);
System.out.println(res);
T 타입을 받아서 아무 값도 리턴하지 않는 함수형 인터페이스
// Consumer<T>
Consumer<Integer> printInt = input -> System.out.println(input);
printInt.accept(10);
T 타입의 값을 제공하는 함수형 인터페이스
// Supplier<T>
Supplier<Integer> get20 = () -> 20;
int res2 = get20.get();
T타입을 받아서 boolean을 리턴하는 함수형 인터페이스
// Predicate<T>
Predicate<String> startWithHong = str -> str.startsWith("Hong");
boolean res3 = startWithHong.test("HongJungWan");
앞서 살펴본 Function<T, R>의 특수한 형태
// UnaryOperator<T>
UnaryOperator<Integer> plus30U = input -> input + 30;
int res4 = plus30U.apply(30);
BinaryOperator는 BiFunction<T, U, R>의 특수한 형태
// BinaryOperator<T>
BinaryOperator<Integer> addTwoIntB0 = (a, b) -> a + b;
int res5 = addTwoIntB0.apply(20, 80);