이론 정리/java

함수형 인터페이스

철매존 2023. 1. 7. 01:40
728x90

함수형 인터페이스

단 하나의 추상 메서드만 선언된 인터페이스

에를 들면

interface MyFunction {
    public abstract int max(int a, int b);
}

이런 식으로 하나의 추상 메서드만 선언된 것을 말한다.

참고로 이거에다가 @FunctionalInterface 라는 어노테이션을 붙이면 컴파일러가 이친구가 제대로 작성된 추상 메서드인지 확인해준다.
-> 엥간하면 이거 붙이자.

그래서 이 함수형 인터페이스 로직을 구현해 주면

MyFunction f = new MyFunction() {
                        public int max(int a, int b) {
                            return a > b ? a : b;
                        }
                };

이렇게 될 것이다.

이를 활용해서 람다식의 참조변수로 쓸 수 있는데

int value = f.max(3,5); // 인터페이스 MyFunction내에 max활용가능

이렇게 된다.

그리고 당연하지만 함수형 인터페이스의 참조변수로 람다식을 참조할 수 있다.

MyFunction f = new MyFunction() {
                        public int max(int a, int b) {
                            return a > b ? a : b;
                        }
                };

이거를

MyFunction f = (a, b) -> a > b ? a : b;

이렇게 바꿔줄 수 있으며

int value = f.max(3,5); // 실제로는 람다식이 호출됨

이렇게 사용 가능하다.

함수형 인터페이스는 메서드의 매개변수로도, 반환타입으로도 사용 가능하다.

java.util.function 패키지

매개변수가 1개인 애들

자주 사용되는 다양한 함수형 인터페이스를 제공해 준다.

함수형 인터페이스 메서드 설명
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에 대한 설명은

Predicate

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.");

이렇게 반환 타입을 boolean으로 주어 참/거짓을 return한다.
이런 느낌으로 조건식으로 써준다.

참고로 Predicate의 경우 다른 Predicate와 결합하거나, 조건문과 결합이 가능하다.

매개변수가 2개인 애들

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

뭐 이 이상 매개변수 3개 넘어가면 만들어 씁시다.

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

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

Collection Framework와 함수형 인터페이스

JDK1.8로 가면서 Collection에서도 함수형 인터페이스와 관련된 많은 변화가 있었다.

그중에 많이 쓰이는 것들이

인터페이스 메서드 설명
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를 수행
Map V computeIfAbsent(K key, Function<K,V> f) 키가 없으면 작업 f 수행 후 추가
Map V computeIfPresent(K key, BiFunction<K,V,V> f) 지정된 키가 있을 때 작업 f 수행
Map V merge(K key, V value, BiFunction<V,V,V> f) 모든 요소에 병합작업 f를 수행
Map void forEach(BiConsumer<K,V) action 모든 요소에 작업 action을 수행
Map void replaceAll(BiConsumer<K,V,V) f 모든 요소에 치환작업 f를 수행