// 예시 코드로 문자열을 길이순으로 정렬하는데, 정렬을 위한 비교함수로 익명클래스를 사용한다.
Collections.sort(words, new Comparator<String>() {
public int compare(String s1, String s2) {
return Integer.compare(s1.length(), s2.length());
}
});
// 다음은 익명 클래스를 사용한 앞의 코드를 람다 방식으로 바꾼 모습이다.
// 자질구레한 코드들이 사라지고 어떤 동작을 하는지가 명확하게 드러남 !
Collections.sort(word,
(s1,s2) -> Integer.compare(s1.length(), s2.length()));
여기서 람다, 매개변수 (s1, s2) 반환값의 타입은 각자 (Comparator<String>), String, int 지만 위의 코드에서는 언급이 없다. 컴파일러가 문맥을 살펴 타입을 추론해준 것이다.
List words = Arrays.asList("김병연","김수미","김형욱","이연우","이용훈");
Collections.sort(words,
(s1, s2) -> Integer.compare(s1.length(), s2.length())); // 에러발생
// 굳이 raw 타입을 사용해야한다면 형변환을 하나하나 해줘야한다..
타입을 명시해야 코드가 더 명확할 때만 제외하고는, 람다의 모든 매개변수 타입은 생략하도록 하자.
//자바 8때 List 인터페이스에 추가된 sort 메서드를 이용하면 더욱 짧아진다.
Collections.sort(words,comparingInt(String::length));
// 람다를 언어 차원에서 지원하면서 기존에는 적합하지 않았던 곳에서도 객체를 실용적으로 사용할 수 있게 되었다.
words.sort(comparingInt(String::length));