티스토리 뷰
728x90
반응형
익명 클래스를 람다 표현식으로 리펙토링
1. 익명 클래스에서 this는 익명클래스 자신을 가리키지만 람다에서 this는 람다를 감싸는 클래스를 가리킨다.
2. 람다에서 감싸는 클래스의 변수를 가릴 수 없다.
int a = 10;
Runnable r1 = () -> {
int a = 2; // Conmpile Error
};
Runnable r2 = new Runnable() {
public void run() {
int a = 2; // Success
}
};
3. 익명 클래스는 인스턴화할 때 명시적으로 형식이 정해지지만 람다의 형식은 콘텍스트에 따라 달라진다.
interface Task {
public void execute();
}
public static void doSomething(Runnable r) {r.run();}
public static void doSomething(Task a) {a.execute();}
doSomething( ()-> System.out.println("Error")); // Runnable, Task 중 모호함
doSomething( (Task) -> System.out.println("Success"));
람다 표현식을 메서드 참조로 리펙토링
메서드 참조를 이용하면 가독성을 높일 수 있다. 메서드명으로 코드의 의도를 명확하게 표현.
최댓값이나 합계를 계산할 때 람다 표현식과 저수준 리듀싱 연산을 조합하는 것보다
Collectors API를 사용하면 코드의 의도가 더 명확
int totalCalories = menu.stream().map(Disp::getCalories).reduce(0, (c1,c2) -> c1+c2); //저수준 리듀싱
int totalCalories = menu.stream.collect(summingInt(Dish::getCalories)); // Collectos API
명령형 데이터 처리를 스트림으로 리펙토링
스트림은 데이터 처리 파이프라인의 의도를 더 명확하게 표현
쇼트서킷과 게으름이라는 최적화, 멀티코어 아키텍처를 활용 제공
List<String> dishNames = new ArrayList<>();
for (Dish dish : menu) {
if (dish.getCalories() > 300) {
dishNames.add(dish.getName());
}
}
menu.parallelStream()
.filter(d -> d.getCalories() > 300)
.map(Dish::getName)
.collect(toList());
728x90
반응형
'Java' 카테고리의 다른 글
[Java] EnumSet, EnumMap (0) | 2023.10.29 |
---|---|
[Java] 날짜, 시간 API (0) | 2023.10.18 |
[Java] Lombok @Getter boolean 변수명 주의할 점 (0) | 2023.09.26 |
[Java] ConcurrentHashMap (0) | 2023.09.13 |
[Java] Map 디폴트 메소드 (0) | 2023.09.10 |
반응형
300x250