람다를 지원하기 전에는 상위 클래스의 기본 메서드를 재정의해 원하는 동작을 구현하는 템플릿 메서드 패턴을 사용했다.
같은 효과의 함수 객체를 받는 정적 팩터리나 생성자를 제공하는 방법이 이를 대체한다.
= 함수 객체를 매개변수로 받는 생성자와 메서드를 더 많이 만들어야 한다. (함수형 매개변수 타입을 올바르게 선택해야 함)
//가장 최근 원소 100개를 유지하는 메서드.
protected boolean removeEldestEntry(Map.Entry<K,V> eldest) {
return size() > 100;
}
/*
removeEldestEntry는 size()를 호출해 맵 안의 원소 수를 알아내는데,
이는 removeEldestEntry가 인스턴스 메서드기 때문에 가능하다.
생성자에 넘기는 함수 객체는 팩터리나 생성자 호출 시 맵의 인스턴스가 존재하지 않아서
이 맵의 인스턴스가 아니다.
맵은 자기 자신도 함수 객체에 건네줘야 한다.
*/
//함수형 인터페이스 -> 굳이 만들 필요 없이 java.util.function에 같은 모양의 인터페이스가 있다.
@FunctionalInterface interface EldestEntryRemovalFunction<K,V>{
boolean remove(Map<K,V> map, Map.Entry<K,V> eldest);
}
필요한 용도에 맞는 것이 있다면 직접 구현하지 말고 표준 함수형 인터페이스랄 활용해야 한다.
java.util.function 패키지에는 총 43개의 인터페이스가 있다. 이 중 기본 인터페이스 6개만 기억하면 나머지를 유추해 사용할 수 있다.