- 익명 클래스에서 사용한 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 ...
}
}