함수형 인터페이스

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