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를 수행 |