BackEnd/Java

Functional Interface 정리

공29 2025. 1. 7. 23:14

함수형 인터페이스

Functional Interface 내용 추가해서 한 번 더 정리.

java.util.function package

함수형 인터페이스 메서드 설명
java.lang.Runnable void run() 매개변수도 없고, 반환값도 없음
Supplier<T> T get() 매개변수는 없고, 반환값만 있음
Consumer<T> void accept(T t) Supplier와 반대로 매개변수만 있고 반환값이 없음
Function<T, R> R apply(T t) 일반적인 함수. 하나의 매개변수를 받아 결과를 반환
Predicate<T> boolean test(T t) 조건식을 표현하는데 사용됨. 매개변수는 하나. 반환 타입은 boolean

Supplier 는 공급자. 매개변수가 없지만 반환값이 있다.
Consumer 는 소비자. 매개변수가 있고 반환값이 없다.
Function은 일반적인 함수로, 입력/출력 둘 다 있고
Predicate는 수학 용어로 참/거짓을 다룬다.
이름 그대로의 뜻을 생각해보면 쉽게 이해할 수 있다.

 

매개변수가 2개인 함수형 인터페이스

함수형 인터페이스 메서드 설명
BiConsumer<T, U> void accept(T t, U u) 두 개의 매개변수만 있고, 반환값이 없음
BiPredicate<T, U> boolean test(T t, U u) 조건식을 표현하는데 사용됨. 매개변수는 둘, 반환값은 boolean
BiFunction<T, U, R> R apply(T t, U u) 두 개의 매개변수를 받아서 하나의 결과를 반환

앞에 두 개를 뜻하는 'Bi'가 붙은 것.

 

매개변수의 타입과 반환 타입이 일치하는 함수형 인터페이스

함수형 인터페이스 메서드 설명
UnaryOperator<T> T apply(T t) Function의 자손.
Function과 달리 매개변수와 결과의 타입이 같다.
BinaryOperator<T> T apply(T t, T t) BiFunction의 자손. BiFunction과 달리 매개변수와 결과의 타입이 같다.

UnaryOperator는 단항연산자, BinaryOperator는 이항연산자이다.

 

Predicate 결합

and(), or(), negate()로 두 Predicate를 하나로 결합 (default 메서드)

Predicate<Integer> p = i -> i < 100;
Predicate<Integer> q = i -> i < 200;
Predicate<Integer> r = i -> i%2 == 0;

Predicate<Integer> notP = p.negate(); // i >= 100
Predicate<Integer> all = notP.and(q).or(r); // i >= 100 && i < 200 || i%2 == 0
Predicate<Integer> all2 = notP.and(q.or(r)); // i >= 100 && (i < 200 || i%2)

등가비교를 위한 Predicate 작성에는 isEqual() 사용

Predicate<String> p = Predicate.isEqual(str1); // isEqual()는 static 메서드
Boolean result = p.test(str2); // str1과 str2가 같은지 비교한 결과 반환
// 간단하게 바꾸면
Boolean result2 = Predicate.isEqual(str1).test(str2);

 

Function 결합

Function<String, Integer> f = (s) -> Integer.parseInt(s, 16);
Function<Integer, String> g = (i) -> Integer.toBinaryString(i);
// f와 g를 합칠 수 있다. f의 입력 타입과 g의 출력 타입으로 구성. f로 나온 출력이 g의 입력으로 들어간다.
Function<String, String> h = f.andThen(g);
// f.compose(g)는 g.andThen(f)와 똑같다. g의 출력이 f의 입력으로 들어간다.
Function<Integer, Integer> h2 = f.compose(g);

 

함수형 인터페이스를 사용하는 컬렉션 프레임워크 메서드

인터페이스 메서드 설명
Collection boolean removeIf(Predicate<E> filter) 조건에 맞는 요소 삭제
List void replaceAll(UnaryOperator<E> operator) 모든 요소를 변환하여 대체
Iterable void forEach(Consumer<T> action) 모든 요소에 작업 action을 수행
Map V compute(K key, BiFunction<K, V, V> f) 지정된 키의 값에 작업 f를 수행
V computeIfAbsent(K key, Function<K, V> f) 키가 없으면, 작업 f 수행 후 추가
V computeIfPresent(K key, BiFunction<K, V, V> f) 지정된 키가 있을 때, 작업 f 수행
V merge(K key, V value, BiFunction<V, V, V> f) 모든 요소에 병합작업 f를 수행
void forEach(BiConsumer<K, V> action) 모든 요소에 작업 action을 수행
void replaceAll(BiFunction<K, V, V> f) 모든 요소에 치환작업 f를 수행