함수형 인터페이스
Java 8 부터는 @FunctionalInterface 어노테이션을 통해 개발자가 커스텀한 함수형 인터페이스를 만들 수 있다. 하지만 모든 상황에 대해 인터페이스를 직접 정의하는 것은 매우 귀찮고 프로젝트의 구조를 복잡하게 만든다.
Java 는 이를 위해 주로 사용하는 형태에 대한 함수형 인터페이스를 미리 정의해 두었다.
Java 기본 제공 함수형 인터페이스
Function<T, R> = T 타입을 받아서 R 타입을 리턴하는 함수 인터페이스
Function<String, Integer> stringToInteger = s -> Integer.parseInt(s);
String str = "13";
stringToInteger.apply(str); // expect: 13
BiFunction<T, U, R> = 두 개의 값(T, U)를 받아서 R 타입을 리턴하는 함수 인터페이스
BiFunction<Integer, Integer, Integer> add = (x, y) -> x + y;
add.apply(3, 4); // expect: 7
Consumer<T> = T 타입을 받아서 아무값도 리턴하지 않는 함수 인터페이스
Consumer<List<String>> printStrings = (strs) -> {
strs.forEach(str -> System.out.println(str));
};
List<String> exams = Arrays.asList("사과", "바나나", "배", "포도", "오렌지");
printStrings.accept(exams);
Supplier<T> = T 타입의 값을 제공하는 함수 인터페이스
// 예제 준비중
Predicate<T> = T 타입을 받아서 boolean을 리턴하는 함수 인터페이스
Predicate<String> isLongerThan3 = s -> s.length >= 3;
List<String> fruits = Arrays.asList("사과", "바나나", "배", "포도", "오렌지");
fruits.stream()
.filter(isLongerThan3)
.collect(Collectors.toList()); // expect: ["바나나", "오렌지"]
UnaryOperator<T> = Function<T, R>의 특수한 형태로, 입력값 하나를 받아서 동일한 타입을 리턴하는 함수 인터페이스
UnaryOperator add10 = x -> x + 10;
UnaryOperator mul2 = x -> x * 2;
add10.andThen(mul2).apply(5); // expect: 30
BinaryOperator<T> = BiFunction<T, U, R>의 특수한 형태로, 동일한 타입의 입렵값 두개를 받아 리턴하는 함수 인터페이스
BinaryOperator<Integer> add = (x, y) -> x + y;
add.apply(3, 4); // expect: 7
참고
https://www.inflearn.com/course/the-java-java8