[작성일: 2023. 02. 13]
java.util.function 패키지
- 자주 사용되는 다양한 함수형 인터페이스 제공
함수형 인터페이스 | 메서드 | 설명 |
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 |
Predicate<String> isEmptyStr = s -> s.length() == 0;
String s = "";
if(isEmptyStr.test(s)) // if(s.length() == 0)
System.out.println("This is an empty String.");
✏️ Quiz
Q. 아래의 빈칸에 알맞은 함수형 인터페이스(java.util.function 패키지)를 적으시오.
Q. 아래의 빈 칸에 알맞은 함수형 인터페이스(java.util.function 패키지)를 적으시오.
[ 1 ] f = () -> (int)(Math.random() * 100) + 1;
[ 2 ] f = i -> System.out.print(i + ", ");
[ 3 ] f = i -> i%2 == 0;
[ 4 ] f = i -> i/10 * 10;
1. 매개변수가 없음. 반환값은 있음. Supplier<Integer>
2. 매개변수가 있음. 반환값은 없음. Consumer<Integer>
3. 조건식. Predicate<Integer>
4. 매개변수가 있음. 반환값있음. Function<Integer>
매개변수가 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) | 두 개의 매개변수를 받아서 하나의 결과를 반환함. |
매개변수의 타입과 반환타입이 일치하는 함수형 인터페이스
함수형 인터페이스 | 메서드 | 설명 |
UnaryOperator<T> | T apply(T t) | Function의 자손. Function과 달리 매개변수와 결과의 타입이 같음. 단항 연산자 |
BinaryOperator<T> | T apply(T t, T t) | BiFunction의 자손. BiFunction과 달리 매개변수와 결과의 타입이 같음. 이항 연산자 |
@FunctionlInterface
public interface UnaryOperator<T> extends Function<T, T> {
static <T> UnaryOperator<T> identity() { // 함등함수
return t->t;
}
}
@FunctionlInterface
public interface Unction<T, T> {
R apply(T t);
...
}
Predicate의 결합
- and(), or(), negate()로 두 Predicate를 하나로 결합 할 수 있음.(default 메서드)
Predicate<Integer> p = i -> i < 100;
Predicate<Integer> q = i -> i < 200;
Predicate<Integer> x = i -> i%2==0;
Predicate<Integer> notP = p.negate();
// i >= 100
Predicate<Integer> all = notP.and(q).or(x);
// 100 <= i && i < 200 || i%2==0
Predicate<Integer> all2 = notP.and(q.or(x);
// 100 <= i && (i < 200 || i%2==0)
System.out.println(all.test(2)); // true
System.out.println(all2.test(2)); // false
- 등가비교를 위한 Prdicate의 작성에는 isEquals()를 사용(static 메서드)
boolean result = Predicate isEqual(str1).tes(str2);
컬렉션 프레임워크와 함수형 인터페이스
- 함수형 인터페이스를 사용하는 컬렉션 프레임웍의 메서드(와일드 카드 생략)
인터페이스 | 메서드 | 설명 |
Collection | boolean removeif(Predicate<E> fillter) | 조건에 맞는 요소를 삭제 |
List | void replaceAll(UnaryOperator<E> operator) | 모든 요소를 변환하여 대체 |
Iterable | void forEach(Consumer<T> action) | 모든 요소에 작업 action을 수행 |
Map | V compute(K key, Function<K, V> f) | 지정된 키의 값에 작업 f를 수행 |
V computelf Absent(K key, Function<K, V) f) | 키가 없으면 작업 f 수행 후 추가 | |
V computeifPresent(K key, BiFunction<K, 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> f) | 모든 요소에 치환작업 f를 수행 |
list.forEach(i -> System.out.printl(i + ", "));
// list의 모든 요소를 출력
list.removeIf(x -> x%2==0 || x%3==0);
// 2 또는 3의 배수 제거
list.replaceAll(i -> i*10);
// 모든 요소에 10을 곱함.
map.forEach((k,v) -> System.out.print(k + v);
// map의 모든 요소를 (k, v) 형식으로 출력함.
🐣 해당 게시글은 자바의 정석(남궁성 님) 영상으로 함께 공부하며 요약/정리한 글입니다.
🐣 입문 개발자가 작성한 글이므로 틀린 내용이나 오타가 있을 수 있습니다.