java.util.function 패키지
대부분의 메서드는 매개변수가 없거나 한 개 또는 두 개, 반환 값이 없거나 한 개
제네릭 메서드로 정의하면 매개변수나 반환 타입이 달라도 문제가 되지 않는다.
java.util.function 패키지에 일반적으로 쓰이는 형식의 메서드를 함수형 인터페이스로 미리 정의
패키지 활용을 통해 함수형 인터페이스에 정의된 메서드 이름 통일
재사용성이나 유지보수 측면에서 효율적
매개변수의 개수, 반환 여부에 따라 함수형 인터페이스 사용 가능
매개변수 없음, 반환값 없음
java.lang.Runable @FunctionalInterface public interface Runnable { public abstract void run(); }
매개변수 없음, 반환값 있음
@FunctionalInterface public interface Supplier<T> { public abstract T get(); }
매개변수 한 개, 반환값 없음
@FunctionalInterface public interface Consumer<T> { public abstract void accept(T t); }
매개변수 한 개, 반환값 있음
@FunctionalInterface public interface Function<T, R> { public abstract R apply(T t); }
매개변수 한 개, 반환 타입 boolean
조건식을 함수(람다식)로 표현하는데 사용
@FunctionalInterface public interface Predicate<T> { public abstract boolean test(T t); }
매개변수 2개
매개변수 두 개, 반환값 없음
@FunctionalInterface public interface BiConsumer<T, U> { public abstract void accept(T t, U u); }
매개변수 두 개, 반환 타입 boolean
조건식을 함수(람다식)로 표현하는데 사용
@FunctionalInterface public interface BiPredicate<T, U> { public abstract boolean test(T t, U u); }
매개변수 두 개, 반환값 있음
@FunctionalInterface public interface BiFunction<T, R> { public abstract R apply(T t); }
Function 변형
Function의 자손, 매개변수와 결과의 타입이 같다.
@FunctionalInterface public interface UnaryOperator<T> { public abstract T apply(T t); }
BiFunction의 자손, 매개변수와 결과의 타입이 같다.
@FunctionalInterface public interface BinaryOperator<T> { public abstract T apply(T t, T t); }
컬렉션 프레임워크
컬렉션 프레임워크 인터페이스에서 함수형 인터페이스를 사용하는 디폴트 메서드
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 를 수행
기본형을 사용하는 함수형 인터페이스
기본형을 사용하는 함수형 인터페이스 제공
A To B Function, 입력은 타입 A, 출력은 타입 B
@FunctionalInterface public interface DoubleToIntFunction { public abstract int applyAsInt(double d); }
To A Function, 입력은 제네릭 타입, 출력은 타입 A
@FunctionalInterface public interface ToIntFunction<T> { public abstract int applyAsInt(T value); }
A Function, 입력은 타입 A, 출력은 제네릭타입
@FunctionalInterface public interface IntFunction<R> { public abstract R apply(T t, U u); }
Obj A Consumer, 입력은 T, 타입 A, 출력은 없음
@FunctionalInterface public interface ObjIntConsumer<T> { public abstract void apply(T t, U u); }
메서드 참조(method reference)
람다식이 하나의 메서드만 호출하는 경우 메서드 참조를 통해 간략히 표현 가능
참조변수 타입이 받는 매개변수를 메서드에서 사용하는 경우
이미 생성된 객체의 메서드를 람다식에서 사용하는 경우 객체의 참조변수를 적어야 한다
함수형인터페이스 f = 클래스이름::메서드이름
함수형인터페이스 f = 참조변수::메서드이름
생성자를 호출하는 람다식도 메서드 참조로 변환 가능
매개변수가 있는 생성자인 경우, 매개변수에 개수에 따라 알맞은 함수형 인터페이스를 사용
필요하다면 함수형 인터페이스를 새로 정의
함수형인터페이스 f = 클래스이름::new
메서드 참조는 람다식을 마치 static 변수처럼 다룰 수 있게 해준다.
'Java' 카테고리의 다른 글
파일(File) (0) | 2022.07.31 |
---|---|
입출력 (I/O) & 스트림(Stream) (0) | 2022.07.31 |
람다 표현식(Lambda Expression) (0) | 2022.07.31 |
정렬(Sort) (0) | 2022.07.30 |
맵(Map) (0) | 2022.07.30 |