->자바에서 함수타입을 표현할때 추상 메서드를 담은 인터페이스의 인스턴스
익명클래스의 인스턴스를 함수객체로 사용하는것은 낡은 기법
코드가 너무길기때문에 적합하지않음
함수형 인터페이스라 불리는 인터페이스-> 람다식을 사용해 만들수있게됨
람다식을 함수 객체로 사용한 예시 코드
Collections.sort(words,
(s1,s2) -> Integer.compare(s1.length(), s2.length())));
타입추론규칙
자바언어 명세의 장 하나를 통째로 차지할만큼 복잡함.
-> 타입을 명시해야 코드가 더 명확할때를 제외하고 람다의 모든 매개변수는 생략하자
람다를 사용함으로써
언어차원에서 지원하면서 기존에는 적합하지 않았던곳에서도
함수객체를 실용적으로 사용할수있게됨
아이템34의 상수별 클래스 몸체와 데이터를 사용한 열거타입
=> 함수객체를 인스턴스 필드에 저장해 상수별 동작을 구현한 열거타입 예시코드
import java.util.function.DoubleBinaryOperator;
public enum Opreation {
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;
Opreation(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);
}
}
->열거타입 상수 동작을 표현한 람다를 DoubleBinaryOperator변수에 할당
메서드나 클래스와 달리 람다는 이름이없고 문서화를 못한다
코드 자체로 동작이 명확히 설명되지 않거나 코드 줄 수가 많아지면 람다를 쓰지 말아야 한다.
람다는 한줄일때 가장 좋고 길어야 세줄 안에 끝내는게 좋음
람다는 함수형 인터페이스에서만 쓰임
추상클래스의 인스턴스를 만들때 람다를 쓸수없으니 익명클래스를 사용해야함
람다는 자신을 참조할수없다
->this 키워드는 바깥 인스턴스를 가리킨다.
->반면 익명클래스에서의 this는 익명클래스의 인스턴스 자신을 가리킨다.
-> 람다도 익명클래스처럼 직렬화 형태가 구현별로 다를수 있기 때문에 람다를 직렬화 하는것은 극히 삼가야한다