요즘들어 스프링을 공부하다보면 람다식이 가끔 나올 때가 있었습니다. 처음에는 람다식인줄도 모르고 무작정 따라치기만 했었는데, 나중에 람다인 것을 알게 되고나서도 그저 따라치기만 했었습니다. 그러다가 코드리뷰를 하면서 조금 복잡해지기 시작하면 보통 람다에서 많이 막히는 일이 빈번히 일어나게되어 어느정도 정리가 필요할 것 같아 포스팅을 하기로 마음먹었습니다.

 

이번 포스팅에선 람다의 개념과, 컬렉션 프레임워크에서 어떻게 배열들을 처리하는지에 대해 알아보려 합니다.

 

1. 람다란?

 

JDK 1.8버전에 새로 추가가 된 람다(Lambda)는 메서드를 하나의 식(expression)으로 표현한 것 입니다. 람다식은 함수를 간략하면서도 명확한 식으로 표현할 수 있게 해줍니다. 메서드를 람다식으로 표현하면 메서드의 이름과 반환값이 없어지므로, 람다식을 '익명 함수(anonymous function)'이라고도 합니다.

 

2. 람다식 작성방법

 

평소 알고있는 메서드 작성방법입니다.

int max(int a, int b) {
	return a > b ? a : b;
}

 

위의 메서드를 람다식으로 변환한다면,

 

(int a, int b) -> {return a > b ? a : b;}

 

위처럼 변환을 할 수 있습니다.

위처럼 반환값이(return)이 있는 경우, return문 대신 식으로 대신할 수 있습니다. 식의 연산결과가 자동적으로 반환값이 되는데, 이때는 문장이 아닌 식이므로 끝에 세미콜론(' ; ')을 붙이지 않습니다.

 

(int a, int b) -> a > b ? a : b

 

위처럼 반환값을 생략한 채로 람다식을 작성할 수 있습니다.

또한 매개변수의 타입을 생략할 수 있습니다. 그 이유는 리턴문을 생략하는 이유와 같은데, 추론이 가능하기 때문입니다.

 

(a, b) -> a > b ? a : b

 

 

위처럼 간단하게 식을 작성할 수 있습니다.

 

2. 컬렉션 프레임워크 에서의 람다

 

컬렉션 프레임워크 인터페이스에 디폴트 메서드가 추가되었는데, 그 중 함수형 인터페이스를 사용하고있습니다. 그 중 일부를 보겠습니다.

 

인터페이스

메서드

설명

Collection

removeIf

조건에 맞는 요소를 삭제

Iterable

forEach

모든 요소에 작업을 수행

List

replaceAll

모든 요소를 변환하여 대체

Map

forEach

모든 요소에 작업을 수행

 

다음은 예제입니다.

 

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

public class Lambda4 {
	public static void main(String[] args) {
		ArrayList<Integer> list = new ArrayList<>();
		for(int i = 0; i < 10; i++) {
			list.add(i);
		}
		
		//list의 모든 요소를 출력
		list.forEach(i -> 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);
		
		Map<String, String> map = new HashMap<>();
		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.print("{" + k + "," + v + "},"));
		System.out.println();
	}
}

 

처음 변수 list를 선언하고, for문을 이용하여 list에 0부터 9까지의 수를 배열로 담았습니다.

 

list.forEach를 통해 0~9를 출력하되, String타입의 문자열 ","를 중간에 삽입하여 출력하였고,

 

boolean 타입의 removeIf 메서드를 호출하여 2 또는 3의 배수를 배열에서 제거한 후 출력했습니다.

 

마지막으로 Map 형태의 key와 value를 삽입한 변수 map에서 forEach를 통해 key와 value를 설정하여 출력하였습니다.

 

 

밑은 출력결과입니다.

 

 

 

 

 

 

참고자료

자바의 정석(남궁성 저) book.naver.com/bookdb/book_detail.nhn?bid=10191151

'코딩 > Java' 카테고리의 다른 글

Java DTO, VO  (0) 2020.09.06
Java Properties class  (0) 2020.08.10
Java Annotation이란? 표준 에너테이션에 대해서  (0) 2020.07.25
Java List, Set, Map  (0) 2020.07.20
Java Iterator  (0) 2020.07.16
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기