Java/Basic

[Java] Lambda 개념 및 사용

Jeong Jeon
반응형

1). 람다함수란?

람다 함수는 프로그래밍 언어에서 사용되는 개념으로 익명 함수(Anonymous functions)를 지칭하는 용어다.

 

2). 람다의 특징

두 개 이상의 입력이 있는 함수는 최종적으로 1개의 입력만 받는 람다 대수로 단순화 될 수 있다. - 커링 (Curring)

 

3). 익명함수?

함수의 이름이 없는 함수. 

명함수들은 공통으로 일급객체(First Class citizen)라는 특징을 가지고 있다.

이 일급 객체란? : 일반적으로 다른 객체들에 적용 가능한 연산을 모두 지원하는 객체를 가르킨다.

함수를 값으로 사용 할 수도 있으며 파라미터로 전달 및 변수에 대입과 같은 연산들이 가능하다.

 

4). 람다의 장단점

 

장점

1. 코드의 간결성 - 람다를 사용하면 불필요한 반복문의 삭제가 가능하며 복잡한 식을 단순하게 표현

2. 지연연산 수행 - 람다는 지연연상을 수행 함으로써 불필요한 연산 최소화

3. 병렬처리 가능 - 멀티쓰레디를 활용하여 병렬처리를 사용 할 수 있다.

 

단점

1. 람다식의 호출이 까다롭다.

2. 람다 stream 사용 시 단순 for문 혹은 while문 사용 시 성능이 떨어진다. => 내부적으로 iterator를 사용하여 구동하는데 깨끗한 기본코드가 원래 더 성능이 좋은건 ... 당연한지라..!

3. 불필요하게 너무 사용하게 되면 오히려 가독성을 떨어 뜨릴 수 있다. => 이것저것 다 람다로 표현하면 이해하기가 힘들 수 있다.

 

5). 람다의 표현식

1. 람다는 매개변수 화살표(->) 함수몸체로 이용하여 사용

2. 함수몸체가 단일 실행문이면 괄호{}를 생략 할 수 있다. !

3. 함수몸체가 return문으로만 구성되어 있는 경우 괄호{}를 생략 할 수 없다!

 

사용방법

() -> {}
() -> 1
() -> { return 1; }

(int x) -> x+1
(x) -> x+1
x -> x+1
(int x) -> { return x+1; }
x -> { return x+1; }

(int x, int y) -> x+y
(x, y) -> x+y
(x, y) -> { return x+y; }

(String test) -> test.length()
test -> test.length()

//Thread 사용시.
(Thread testThread) -> { testThread.start(); }
testThread -> { testThread.start(); }

 

람다를 사용할때는 함수형 Interface를 빼놓을수가 없다.

Functional Interface를 사용하는 방법을 알아두는것이 필수...!

 

간단하게 functional Interface를 만들어 사용해보자

 

첫번째 @FunctionalInterface를 선언하여 타겟 인터페이스를 만든다.

@FunctionalInterface
public interface functions {

	public int calc(int x, int y);
}

 

두번째 람다식을 이용하여 사용해보자.

functions plusFunction = (x,y)-> x+y;
System.out.println(plusFunction.calc(1, 3));

 

심심하니까 Lambda와 Stream Interface를 이용하여 형변환 예제를 한번 해보도록하자

public class Score {
	public static void main(String[] args) {

		List<String> score = Arrays.asList("1,2,3,8,5,4,3".split(","));

		//Stream을 이용한 메서드활용 List<String> to List<Integer> parsing
		List<Integer> normal = parse(score);

		//Stream + Lambda => List<String> to List<Integer> parsing
		List<Integer> lamda = score.stream().map(Integer::parseInt).collect(Collectors.toList());

		//합계 구하기
		int sum = lamda.stream().mapToInt(Integer::intValue).sum();
		System.out.println(sum);

	}

	//Stream을 사용한 파싱 메서드
	public static List<Integer> parse(List<String> list) {
		return list.stream()
			.map(Integer::parseInt)
			.collect(Collectors.toList());
	}
}

각각을 비교하면 어떤 장점이 있는지 확인할수 있다.

 

간단하게 구현이 가능했다.

지난번에 java에서 제공하는 함수형 인터페이스를 봤었는데 다시한번 보는게 좋을거같다~!

반응형