본문 바로가기

코딩/JAVA 공부

[JAVA] 자바의 정석 _ java.util.function 패키지

 * function 패키지

자주 사용되는 함수형 인터페이스

- 매개변수가 0개 혹은 1개인 함수형 인터페이스

함수형 인터페이스 메서드 설명
java.lang.Runnable void run() 매개변수, 반환값 없음
Supplier<T> T get() 매개변수는 없고, 반환값만 있음
Consumer<T> void accept(T t) 매개변수는 있고, 반환값 없음
Function<T, R> R applt(T t) 일반적인 함수,
하나의 매개변수를 받아 결과 반환
Predicate<T> boolean test(T t) 조건식을 표현할 때 사용
매개변수 하나, 반환 타입은 boolean
Predicate<String> isEmptyStr = s -> s.length()==0;
String s = "";

if(isEmptyStr.test(s){
    System.out.println("This is an empty String);
}

- 매개변수가 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) 두 개의 매개변수를 받아 하나의 결과 반환

- 매개변수 3개 이상인 경우엔 직접 만들면 됨.

@FunctionalInterface
interface TriFunction<T,U,V,R>{
    R apply(T t, U u, V v);
}

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

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

 * Predicate의 결합

- and(), or(), negate() 로 두 Predicate를 하나로 결합

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

 * 컬렉션 프레임웍과 함수형 인터페이스

인터페이스 메서드 설명
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를 수행
list.forEach(i -> System.out.print(i)); 	// list 모든 요소 출력
list.removeIf(x -> x%2 == 0 || x%3 ==0);	// list 에서 2 또는 3의 배수 제거
list.replaceAll(i->i*10)			// 모든 요소에 10 곱하기
// map의 모든 요소를 {k,v}의 형식으로 출력
map.forEach((k,v) -> System.out.println("{" +k+ "," +v+ "}"));