함수형 인터페이스
함수형 인터페이스
기본 함수형 인터페이스
Function
- 입력 O, 반환 O
- 데이터 변화, 필드 추출 등
1
2
3
4
5
6
@FunctionalInterface
public interface Function<T, R> {
R apply(T t);
...
}
Consumer
- 입력 O, 반환 X
- 로그 출력, DB 저장 등
1
2
3
4
5
6
@FunctionalInterface
public interface Consumer<T> {
void accept(T t);
}
Supplier
- 입력 X, 반환 O
- 객체 생성, 값 반환 등
1
2
3
4
5
@FunctionalInterface
public interface Supplier<T> {
T get();
}
Runnable
- 입력 X, 반환 X
- 스레드 실행(멀티스레드)
1
2
3
4
5
@FunctionalInterface
public interface Runnable {
void run();
}
특화 함수형 인터페이스
Predicate
- 입력 O, 반환 boolean
- 조건 검사, 필터링 용도
1
2
3
4
5
@FunctionalInterface
public interface Predicate<T> {
boolean test(T t);
}
Function쓰면 되는데 굳이 필요할까?
- 의미의 명확성
- 이 함수는 조건을 검사하거나 필터링 요도로 쓰인다는 의도가 분명해 짐
- 가독성 및 유지 보수성
- 조건을 판단하는 함수는
Predicate<T>라는 패턴을 사용함으로써 의미 전달이 명확 - boolean 판단 로직이 들어가는 부분에서
Predicate<T>를 사용하면 코드 가독성과 유지 보수성이 향상 됨- 이름도 명시적이고, 제네릭에
Boolean을 적지 않아도 됨
- 이름도 명시적이고, 제네릭에
- 조건을 판단하는 함수는
Operator
- 같은 타입의 값들을 받아서 동일한 타입의 결과를 반환
UnaryOperator(단항 연산)
- 하나의 피연산자에 대해 연산을 수행하는 것을 의미
- 입력과 결과가 동일한 타입인 연산을 수행할 때 사용
1
2
3
4
@FunctionalInterface
public interface UnaryOperator<T> extends Function<T, T> {
}
BinaryOperator(이항 연산)
- 두 개의 피연산자에 대해 연산을 수행하는 것을 의미
- 같은 타입의 두 입력을 받아, 같은 타입의 결과를 반환할 때 사용
1
2
3
4
@FunctionalInterface
public interface BinaryOperator<T> extends BiFunction<T, T, T> {
}
기타 함수형 인터페이스
입력 값이 2개 이상
- 매개 변수가 2개 이상 필요한 경우에는
BiXxx시리즈를 사용하면 됨
입력 값이 3개 이상
- 지원하지 않으므로 직접 함수형 인터페이스를 만들어서 사용
기본형 지원 함수형 인터페이스
기본형 지원 함수형 인터페이스가 존재하는 이유
- 오토박싱/언박싱으로 인한 성능 비용을 줄이기 위해
- 자바 제네릭의 한계를 극복하기 위해
Function
IntFunction: 매개현수가 기본형intToIntFunction: 반환 타입이 기형IntIntToLongFunction: 매개 변수가Int, 반환 타입이long
기타
IntOperatorIntConsumerIntSupplierIntPredicate
참고
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.