SMALL
안녕하세요 남갯입니다.
오늘은
아이템 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);
}
}
람다는 이름이 없고 문서화도 못한다. 따라서 코드 자체로 동작이 명확히 설명되지 않거나 코드 줄 수가 많아지면 람다를 쓰면 안된다.
LIST
'책 > 이펙티브자바 3E' 카테고리의 다른 글
[Effective Java] 아이템 18. 상속보다는 컴포지션을 이용하라 (0) | 2020.01.06 |
---|---|
[Effective Java] 아이템 43. 람다보다는 메소드 참조를 이용하라. (0) | 2020.01.02 |
[Effective Java] 아이템 7. 다 쓴 객체 참조를 해제하라. (0) | 2019.12.30 |
[Effective Java] 아이템 6. 불필요한 객체 생성을 피하라. (0) | 2019.12.27 |
[Effective Java] 아이템 1. 생성자 대신 정적 팩터리 메서드를 고려하라. (3) | 2019.08.06 |