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를 수행 |
'이론 정리 > java' 카테고리의 다른 글
메서드 참조 (0) | 2023.01.08 |
---|---|
람다식이란?? (2) | 2023.01.07 |
logging - java에서 System.out.println()을 왜 사용하면 안될까?? (0) | 2023.01.06 |
java 깊은복사 vs 얕은복사(feat.clone) (0) | 2023.01.02 |
ThreadLocal - 쓰레드로컬 이란? (0) | 2022.12.28 |