Java 8 API의 몇몇 함수형 인터페이스는 다양한 유틸리티 메서드를 포함한다.
예를 들어 Comparator, Function, Predicate 같은 함수형 인터페이스는 람다 표현식을 조합할 수 있도록 유틸리티 메서드를 제공한다.
이것은 무슨 의미일까?
간단히 말해, 간단한 여러 개의 람다 표현식을 조합해서 두 Predicate의 or 연산을 수행하는 커다란 Predicate를 만들 수 있다. 또한 한 함수의 결과가 다른 함수의 입력이 되도록 두 함수를 조합할 수 있다.
그런데 Java 8 API에서 지원하는 Comparator, Function, Predicate 인터페이스는 함수형 인터페이스 아닌가?
"함수형 인터페이스는 추상화 메서드가 1개뿐이라며?!" 라고 생각할 수 있을것이다.
그렇다. 추상화 메서드가 1개면 함수형 인터페이스라고 했지 default 메서드가 없어야 한다곤 안했다.
실제 Predicate 인터페이스를 보면 test메서드는 추상메서드이고, and와 negate, or 메서드가 default 메서드로 구현되어 있는 것을 확인할 수 있다.
@FunctionalInterface
public interface Predicate<T> {
boolean test(T t);
default Predicate<T> and(Predicate<? super T> other) {
Objects.requireNonNull(other);
return (t) -> test(t) && other.test(t);
}
default Predicate<T> negate() {
return (t) -> !test(t);
}
default Predicate<T> or(Predicate<? super T> other) {
Objects.requireNonNull(other);
return (t) -> test(t) || other.test(t);
}
...
}
함수형 인터페이스에서 default 메서드를 구현하고 람다 표현식을 조합해 사용할 수 있는것이다.
계산기를 구현하는 코드로 예로 들어보자.
int x = 1; // 처음 1 입력
x = x + 5; // + 1 입력
x = x - 2; // - 2 입력
result = x * 3; // x 3 입력
실제 계산기를 사용해보면 연산된 결과값이 바로 입력값이 되어 다른 연산을 바로 진행할 수 있다. 이처럼 코드도 결과를 계속해서 이어서 연산을 진행하고, 조합할 수 있다.
@FunctionalInterface
public interface Calculator {
Integer calculate(Integer a, Integer b);
default Calculator andThen(Calculator after, Integer c) {
Objects.requireNonNull(after);
return (Integer a, Integer b) -> after.calculate(calculate(a, b), c);
}
}
Calculator addCalculator = (a, b) -> a + b;
Calculator minusCalculator = (a, b) -> a - b;
Calculator multiplyCalculator = (a, b) -> a * b;
Integer result = addCalculator
.andThen(minusCalculator, 2) // - 2 입력
.andThen(multiplyCalculator, 3); // x 3 입력
.addCalculator.calculate(1, 5); // 1 입력 후 + 5 입력
Calculator 함수형 인터페이스에 andThen default 메서드를 구현해 결과값을 입력값으로 받아 다른 연산을 진행하도록 구현하였다. 이번 방식으로 코드 파이프라인을 구현해 사용할 수 도 있다.
'Java' 카테고리의 다른 글
[모던 자바] 스트림(Stream) 활용하기 (0) | 2022.03.03 |
---|---|
[모던 자바] 스트림(Stream)이란 무엇인가? (0) | 2022.03.02 |
[모던 자바] Java 8 메서드 참조와 생성자 참조란? (0) | 2022.03.02 |
[모던 자바] Java 8 API에서 지원하는 함수형 인터페이스 (0) | 2022.02.28 |
[모던 자바] 람다란 무엇인가? (0) | 2022.02.28 |