본문 바로가기

IT/이펙티브자바 3E

[Effective Java] 아이템 42. 익명클래스 보다는 람다를 사용하라.

안녕하세요 남갯입니다.


오늘은 


아이템 42. 익명클래스 보다는 람다를 사용하라


를 작성해보려고 합니다.



Collections.sort(words, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return Integer.compare(o1.length(), o2.length());
}
});

위와 같이 익명클래스를 이용해서 생성하게 되면 코드가 너무길고, 함수형 프로그래밍에 적합하지 않았지만 람다를 이용해 불필요한 코드가 사라지고 동작을 명확하게 이해 가능하다.


Collections.sort(words, (o1, o2) -> Integer.compare(o1.length(), o2.length()));

타입을 명시해야 코드가 더 명확할 때만 제외하고는, 람다의 모든 매개변수 타입을 생략하자.



비교자 생성 메소드를 이용하면 이코드를 더 간결하게 만들 수 있다.

Collections.sort(words, Comparator.comparingInt(String::length));


자바 8부터 추가된 sort 메소드를 이용하면 더 간결하게 가능.

words.sort(Comparator.comparingInt(String::length));





public enum OperationBefore {
PLUS("+") {
public double apply(double x, double y) {
return x + y;
}
};
//////////......
private final String symbol;

OperationBefore(String symbol) {
this.symbol = symbol;
}
}

위와 같이 일일이 다 생성해줘야 했던 코드를 apply코드를 람다로 생성하면 된다.


이전 글에서 작성한 배달의민족 enum 사용하기에서 나온 것과 같이

java.Util.function 패키지가 제공하는 다양한 함수 인터페이스를 받아서 사용가능하다.


2019/12/19 - [IT/개발경험기] - Enum을 통한 개선경험

이곳에 배달의 민족 블로그에 있다.



public enum Operation {
PLUS("+", (x, y) -> x + y),
MINUS("-", (x, y) -> x - y),
TIMES("*", (x, y) -> x * y),
DIVIDE("/", (x, y) -> x / y);

private final String symbol;
private final DoubleBinaryOperator op;

Operation(String symbol, DoubleBinaryOperator op) {
this.symbol = symbol;
this.op = op;
}

@Override
public String toString() {
return symbol;
}

public double apply(double x, double y) {
return op.applyAsDouble(x, y);
}

}


람다는 이름이 없고 문서화도 못한다. 따라서 코드 자체로 동작이 명확히 설명되지 않거나 코드 줄 수가 많아지면 람다를 쓰면 안된다.