반응형

일반적으로 함수는 아래 4가지 요소가 필요합니다.

  • 이름
  • 리턴 타입
  • 파라메터
  • 함수 몸통

람다식은 위 4개중에 아래 2개만을 가집니다.

(parameter list) -> body

-> 왼쪽엔 파라메터 오른쪽엔 함수 본문을 정의합니다.

함수본문은 단일 표현식이나 명령문일수 있습니다.



(Integer e) -> e * 2
위코드는 단지 한줄짜리 람다식입니다.
세미콜론과 retrun 키워드가 없습니다.



(Integer e) -> {

double sqrt = Math.sqrt(e);

double log = Math.log(e);


return sqrt + log;

}

두개이상의 행으로 구성된 람다식입니다.

세미콜론과 결과를 반환하는 return 키워드도 필요합니다.




명령형 스타일 기능적 스타일


int result = 0;

for(int e : values) {

if( e>3 && e % 2 == 0 ) {

result = e * 2;

break;

}

}



int result = values.stream()

.filter(e -> e > 3)

.filter(e -> e % 2  == 0 )

.map(e -> e * 2)

.findFirst()

.orElse(0);



위에 두코드는 동일한결과를 얻을수 있습니다.

첫번재 코드는 분기와 중단을 통하여 흐름을 따라야 합니다.

두번째 코드는 기능 구성을 사용하여 가독성이 높습니다.


두번째 코드는 주어진 값이 3보다 큰값만 선택한다. 이값중에서 짝수값만 선택한다. 이값에 두배로 하고, 첫번째 값을 선택합니다.


함수표현식의 각각의 람다식의 간결성에 의존적입니다.

람다식이 여러줄로 펼처지는경우는 기능적스타일의 프로그래밍의 요점이 없어질수가 있습니다.


 

Sytem.out.println(values.stream()

.mapToInt(e-> {

int sum = 0

for (int i = 1; i <= e; i++){

if ( e % i == 0 ) {

sum += i;

}

}

return sum;

})

.sum());



이코든느 기능적 스타일로 작성 됬지만 기능적 스타일의 이점은 없어집니다.

  1. 읽기 어렵니다.
  2. 목적이 명확하지 않다.
  3. 코드품질이 나쁘다.
  4. 테스트하기가 어렵다.
  5. 코드 커버리지 불량.


문제를 해결하는 방법은 람다를 매우 간결하게 만드는 것이다.

람다에서 대괄호를 사용하지 마세요.

System.out.println(
values.stream90
.mapToInt(e -> sumOfFacetoers(e))
.sum());


public static int sumOfFactors(int number) {
return IntStream.rangeClosed(1, number)
.filter(i -> number % i == 0 )
.sum();
}



짧고 간결한 람다식은 코드 가독성을 높이며, 이것은 기능적 스타일에서 프로그래밍의 주요 이점중 하나 입니다.

여러줄로 펼처지는 람다식은 코드가 읽기가 어렵게된다. 다중 라인 람다는 테스트하고 재사용하기 어렵기 때문에 중복된 코드 생성과 품질 저하를 초해한다. 가능한 경우 람다식을 메서드 참조로 바꾸는것이 좋다.




https://www.ibm.com/developerworks/library/j-java8idioms6/index.html

반응형

+ Recent posts