티스토리 뷰

Java

[Java] Lambda 표현식으로 리펙토링

snail voyager 2023. 10. 12. 00:24
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