본문 바로가기
JAVA BASE/Lambda&Stream(람다와 스트림)

03. [자바] 람다 - function패키지 인터페이스

by staticClass 2021. 1. 12.

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!}

댓글