Skip to content

Latest commit

 

History

History
47 lines (38 loc) · 1.25 KB

09장(리팩터링, 테스팅, 디버깅).md

File metadata and controls

47 lines (38 loc) · 1.25 KB

리팩터링, 테스팅, 디버깅

익명클래스와 람다

  • 익명 클래스에서 사용한 this는 자신을 가리키지만, 람다에서 this는 람다를 감싸는 클래스를 가리킨다.
  • 익명 클래스는 감싸고 있는 클래스의 변수를 가릴 수 있다.(섀도 변수, shadow variable)
int a = 10;
Runnable r1 = () -> {int a = 2; // 컴파일 에러 System.out.println(a);};

Runnable r2 = () new Runnable() {
 public void run() {
   int a = 2; // 모든 것이 잘 작동한다.
   System.out.println(a);
 }
}

람다 표현식을 메서드 참조로 리팩터링하기

Map<CaloricLevel, List<Dish>> dishesByCaloricLevel = 
  menu.stream()
    .collect(groupingBy(dish -> {
        if(dish.getCalories() <= 400) return CaloricLevel.DIET;
        else if(dish.getCalories() <= 700) return CaloricLevel.NORMAL;
        else return CaloricLevel.FAT;
}));

위 코드에서 람다 표현식을 메서드로 따로 뺀 후 메서드 참조를 이용할 수 있다.

Map<CaloricLevel, List<Dish>> dishesByCaloricLevel = 
  menu.stream()
    .collect(groupingBy(Dish::getCaloricLevel));

public Dish {
  ...
  public CaloricLevel getCaloricLevel() {
    if(...
    else if (...
    else ...
  }
}