프로그래밍 언어/JAVA(자바)

[자바/java] 람다식(Lambda) 정리하기 (2. 함수형 인터페이스(Functional Interface) : 응용)

냠냠:) 2021. 4. 15. 23:30

java.util.function 패키지

우리가 주로 사용하는 메서드의 타입, 매개변수 개수, 반환 타입 등, java.util.function 패키지에 일반적으로 자주 쓰이는 형식의 메서드를 함수형 인터페이스로 미리 적용해 놓았다.

 

function 패키지를 사용해서 람다식을 구현하게 된다면, 메서드 이름도 통일되고, 재사용성이나 유지보수 측면에서도 유리하기 때문에 활용하는 것을 추천한다.

 

함수형 인터페이스 메서드 설명
java.lang.Runnable

void run() 매개변수도 없고, 반환값도 없음.
Supplier<T>

T get() 매개변수가 없고, 반환값만 있음.
Consumer<T>

void accept(T t) 매개변수가 있고, 반환값이 없음
Function<T,R>

R apply(T t) 일반적인 매개변수 하나를 받아 반환하는 함수
Predicate<T>

boolean test(T t) 조건식을 표현하는데 사용, 반환 타입은 boolean
위 표에서 T는 데이터 타입, R은 반환(return)타입을 의미한다.

 

Predicate는 조건식을 람다식으로 표현하는데 사용한다.

1
2
3
4
5
6
7
8
9
Predicate<Integer> isZero = (number) -> number == 0 ? true : false;
        
System.out.println(isZero.test(0));
System.out.println(isZero.test(1));
 
 
//true
//false
 
cs

매개변수로 들어온 수가 0이면 true, 0이 아니면 false를 반환하는 람다식

 

 

매개변수가 두 개인 함수형 인터페이스

매개변수의 개수가 2개인 함수형 인터페이스는 이름 앞에 'Bi'가 붙는다.

함수형 인터페이스 메서드 설명
BiConsumer<T, U> void accept(T t, U u) 두 개의 매개변수, 반환 값은 없음.
BiPredicate<T, U> boolean test(T t, U u) 두 개의 매개변수, 반환 값은 boolean
BiFunction<T, U, R> R apply(T t, U u) 두 개의 매개변수, 하나의 결과 반환

 

UnaryOperator와 BinaryOperator

Function, BiFunction 인터페이스의 자식이 있는데, 각각 UnaryOperator와 BinaryOperator이다.

이 둘의 특징은 매개변수의 타입과 반환타입의 타입이 모두 일치한다는 점이다.

함수형 인터페이스 메서드
UnaryOperator<T> T apply(T t)
BinaryOperator<T> T apply(T t, T t)

 

 

Collection Framework의 Functional Interface

주로 사용하는 컬렉션 프레임워크의 인터페이스(List, map 등)에 다수의 디폴트 메서드가 추가되었는데, 그중의 일부는 함수형 인터페이스를 사용한다.

인터페이스 메서드  설명
Collection boolean removeIf(Predicate<E> f) 조건에 맞는 값 삭제
List void replaceAll(UnaryOperator<E> o) 리스트의 모든 요소를 조건에 맞게 대체
iterable void forEach(Consumer<T> a) 모든 요소에 작업 a를 실행
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> a) 모든 요소에 작업 a 수행
void replaceAll(BiFunction<K,V,V> f) 모든 요소에 치환작업 f 수행

Map인터페이스에 있는 compute로 시작하는 메서드들은 맵의 value를 변환하는 일을 하고 merge는 map을 병합한다.

 

[List 실습]

public static void main(String[] args) {
	/* -------------List---------------*/
		
	//list : replaceAll
	List<Integer> list = new ArrayList<Integer>();
	for(int i = 0; i < 10; i++) {
		list.add(i);
	}
	list.replaceAll(x -> x * 10);
	System.out.println("List replaceAll : "+ list);
	
	//list : forEach
	System.out.print("List forEach : ");
	list.forEach(x -> System.out.print(x +" "));
	
	//list : removeIf
	list.removeIf(x -> x % 3 == 0);
	System.out.println("\nList removeIf : "+list);
	
	//list : replaceAll
	list.replaceAll(x -> x + 2);
	System.out.println("List replaceAll : "+list);
  }
  
output
List replaceAll : [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
List forEach : 0 10 20 30 40 50 60 70 80 90 
List removeIf : [10, 20, 40, 50, 70, 80]
List replaceAll : [12, 22, 42, 52, 72, 82]

 

[Map 실습]

public static void main(String[] args) {
	/* -------------Map---------------*/
	Map<String, Integer> map = new HashMap<>();
	map.put("1", 1);
	map.put("2", 2);
	map.put("3", 3);
	map.put("4", 4);
	
	//map : compute
	map.compute("1", (k, v) -> v * 10);
	System.out.println("Map compute : "+map);
	
	//map : computeIfAbsent
	map.computeIfAbsent("5", k -> Integer.MAX_VALUE);
	System.out.println("Map computeIfAbsent : "+map);
	
	//map : computeIfPresent
	map.computeIfPresent("5", (k, v) -> v = Integer.MIN_VALUE);
	System.out.println("Map computeIfPresent : "+map);
	
	map.put("6", 1);
	//map : merge
	//"6"에 해당하는 key가 있다면 100, 없다면 4
	map.merge("6", 4, (oldValue, newValue) -> oldValue * 100);
	System.out.println("Map merge : "+map);
	
	//map : replaceAll
	//key, value를 파라미터로 받아 값을 리턴,
	map.replaceAll((k, v) -> k.equals("2") ? v : v * 10);
	System.out.println("map replcateAll : "+map);
}
    
output
Map compute : {1=10, 2=2, 3=3, 4=4}
Map computeIfAbsent : {1=10, 2=2, 3=3, 4=4, 5=2147483647}
Map computeIfPresent : {1=10, 2=2, 3=3, 4=4, 5=-2147483648}
Map merge : {1=10, 2=2, 3=3, 4=4, 5=-2147483648, 6=100}
map replcateAll : {1=100, 2=2, 3=30, 4=40, 5=0, 6=1000}

 

 

 

-> [자바/java] 람다식(Lambda) 정리하기 (3. 람다식의 다양한 형태) 바로가기 : tosuccess.tistory.com/193

 

[개인 공부를 위한 정리입니다. 참고용으로만 활용하세요]

Reference

Java의 정석 (남궁 성 지음)

반응형