특정 함수나 동작을 나타내기 위해 사용했던 함수 객체 - 낡은 기법
Collections.sort(words, new Comparator<String>() {
public int compare(String s1, String s2) {
return Integer.compare(s1.length(), s2.length());
}
});
- 익명 클래스의 인스턴스를 함수 객체라고 함
- 익명 클래스 방식은 코드가 너무 길기 때문에 함수형 프로그래밍에 적합하지 않음
람다식
Collections.sort(words, (s1, s2) -> Integer.compare(s1.length(), s2.length()));
- 매개변수 s1,s2의 타입을 명시하지 않았지만 컴파일러가 문맥을 보고 타입을 추론해줌
- 타입을 명시해야 코드가 더 명확할 때를 제외하고는 람다의 모든 매개변수 타입은 생략하자
비교자 생성 메서드
Collections.sort(words, comparingInt(String::length));
- 비교자 생성 메서드를 사용해 더 간결하게 만들 수 있음
List 인터페이스의 sort 사용하기
words.sort(comparingInt(String::length));
람다 사용 예시
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);
}
}
- 열거 타입의 인스턴스 필드를 이용하는 방식으로 상수별로 다르게 동작하는 코드를 쉽게 구현할 수 있음