java.util.function패키지
java.util.function패키지에 람다식을 구현할 수 있는 여러 형식의 인터페이스를 미리 정의해 놓았다.
가능하면 매번 새로운 함수형 인터페이스를 정의하지 말고 이 패키지의 인터페이스를 활용하는게 좋다.
매개변수가 없거나 하나인 함수형 인터페이스
함수형 인터페이스 | 메소드 | 설 명 |
java.lang.Runnable | void run() | 매개변수가 없고, 반환값도 없음. |
Supplier<T> | T get() | 매개변수가 없고, 반환값만 있음. |
Consumer<T> | void accept(T t) | 매개변수만 있고, 반환값이 없음. |
Function<T,R> | R apply(T t) | 하나의 매개변수로 결과를 반환함. |
UnaryOperator<T> | T apply(T t) | Function의 자손으로 매개변수의 타입과 반환값의 타입이 같다. 하나의 매개변수로 결과를 반환한다. |
Predicate<T> | boolean test(T t) | 조건식을 표현하는데 사용됨. 매개변수는 하나 반환 타입은 boolean |
매개변수가 두개인 함수형 인터페이스
매개변수가 2개인 함수형 인터페이스는 이름 앞에 접수가 'Bi'가 붙는다.
함수형 인터페이스 | 메소드 | 설 명 |
BiConsumer<T, U> | void accept(T t, U u) | 두개의 매개변수만 있고, 반환값이 없음. |
BiFunction<T, U, R> | R apply(T t, U u) | 두개의 매개변수로 결과를 반환함. |
Operator<T> | T apply(T t, T t) | Function의 자손으로 모든 매개변수의 타입과 반환값의 타입이 같다. 두개의 매개변수로 결과를 반환한다. |
BiPredicate<T, U> | boolean test(T t, U u) | 조건식을 표현하는데 사용됨. 매개변수는 하나 반환 타입은 boolean |
매개변수가 두 개 이상인 함수형 인터페이스가 필요하다?
직접 만들어서 써야한다.
@FunctionalInterface
interface TriFunction<T, U, V, R>{
R apply(T t, U u, V v);
}
3개의 매개변수가 필요하다면 위와 같을 것이다.
컬렉션 객체와 함수형 인터페이스
인터페이스 | 메서드 | 설명 |
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를 수행 |
몇가지 예제.
import java.util.ArrayList;
public class Main {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<Integer>();
for(int i = 0 ; i < 10 ; i++) {
list.add(i);
}
for(int i : list)System.out.print(i+",");
System.out.println();
// list에서 2 또는 3의 배수를 제거한다.
list.removeIf(x -> x%2==0 || x%3==0);
System.out.println(list);
list.replaceAll(i -> i*10);
System.out.println(list);
}
}
0,1,2,3,4,5,6,7,8,9,
[1, 5, 7]
[10, 50, 70]
import java.util.HashMap;
import java.util.Map;
public class Main {
public static void main(String[] args) {
Map<String, String> map = new HashMap<String, String>();
map.put("1", "1");
map.put("2", "2");
map.put("3", "3");
map.put("4", "4");
// map의 모든 요소를 {k,v}의 형식으로 출력한다.
map.forEach((k, v) -> System.out.println("key : " + k + " / " + "value : " + v ));
map.compute("1", (k, v) -> v+"@");
map.replaceAll((k, v) -> v+"!");
System.out.println(map);
}
}
key : 1 / value : 1
key : 2 / value : 2
key : 3 / value : 3
key : 4 / value : 4
{1=1@!, 2=2!, 3=3!, 4=4!}
댓글