람다는 메서드로 전당할 수 있는 익명 함수를 단순화한 것으로
파라미터 리스트, 바디, 반환 형식, 발생할 수 있는 예외리스트를 가질 수 있다.
Comparator byWeight = new Comprator() {
public int compare(Apple a1, Apple a2) {
return a1.getWeight().compareTo(a2.getWeight());
}
}
위의 코드를 람다식으로 사용하면 밑에처럼 간결해질 수 있다.
Comparator<Apple> byWeight = (Apple a1, Apple a2) -> a1.getWeight().compareTo(a2.getWeight());
(Apple a1, Apple a2)는 람다 파라미터
-> 화살표 이후는 람다 바디
그래서 람다는 어디에 어떻게 사용하는 것일까?
함수형 인터페이스에 람다 표현식으로 추상 메서드 구현을 전달할 수 있다.
변수에 할당할 수 있고 함수형 인터페이스를 인수로 받는 메서드로 전달할 수 있고 함수형 인터페이스의 추상 메서드와 같은 시그니처를 갖는다.
public String processFile() throws IOException{
try (BufferedReader br = new BufferedReader(new FileReader("data.txt"))){
return br.readLine();
}
}
여기서 processFile을 동작 파라미터화 할 수 있다.
String result = processFile(BufferedReader br) ->
br.readLine() + br.readLine());
또한 특정 람다 표현식을 축약한 메서드 참조 기능도 있다.
inventory.sort(comparing(Apple::getWeight));
명시적으로 메서드를 참조하면서 사과의 무게별로 비교해서 정렬하는 것이라는 가독성을 높여준다.
메서드 참조에는
정적메서드 참조
Integer::parseInt
다양한 형식의 인스턴스 메서드 참조
String::length
기존 객체의 인스턴스 메서드 참조
Transaction 객체를 할당받은 expensiveTransaction 지역 변수가 있고 Transaction에는 getValue 메서드가 있다면
expensiveTransaction::getValue로 사용할 수 있다.
또한 생성자 참조도 가능하다
ClassName::new
Supplier c1 = Apple::new;
Apple a1 = c1.get();