당신은 사용 람다 표현식을 익명 메소드를 만들 수 있습니다. 그러나 때로는 람다식이 기존 메서드를 호출하는 것 외에는 아무것도 수행하지 않습니다. 이러한 경우 기존 방법을 이름으로 언급하는 것이 더 명확합니다. 메서드 참조를 사용하면이 작업을 수행 할 수 있습니다. 그들은 이미 이름을 가지고있는 메소드를위한 작고 읽기 쉬운 식입니다.
classPersonAgeComparator implementsComparator<Person> { publicintcompare(Person a, Person b) { return a.getBirthday().compareTo(b.getBirthday()); } }
// Without method reference Arrays.sort(rosterAsArray, newPersonAgeComparator());
// With lambda expression Arrays.sort(rosterAsArray, (Person a, Person b) -> { return a.getBirthday().compareTo(b.getBirthday()); } );
// With method reference Arrays.sort(rosterAsArray, Person::compareByAge);
// Reference to an instance method of a particular object classComparisonProvider { publicintcompareByName(Person a, Person b) { return a.getName().compareTo(b.getName()); }
publicintcompareByAge(Person a, Person b) { return a.getBirthday().compareTo(b.getBirthday()); } } ComparisonProvidermyComparisonProvider=newComparisonProvider(); Arrays.sort(rosterAsArray, myComparisonProvider::compareByName);
// Reference to an instance method // of an arbitrary object of a particular type
위에 처럼 Comparator클래스를 만든후 Arrays.sort 메소드를 사용해서 만들었다 이것을 람다로 바꾸면
1 2 3 4 5 6 7
Arrays.sort(rosterAsArray, (Person a, Person b) -> { return a.getBirthday().compareTo(b.getBirthday()); } );
위에 처럼 익명 클래스를 이용해서 처리를 하였다.
여기서 메소드 참조를 사용하면
1 2 3
Arrays.sort(rosterAsArray, Person::compareByAge);
위에 처럼 바꿀수 있는것인데 이것이 정적 메서드 참조한 예이다.
두번째 특정 객체의 인스턴스 메소드 참조는
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
classComparisonProvider { publicintcompareByName(Person a, Person b) { return a.getName().compareTo(b.getName()); }
publicintcompareByAge(Person a, Person b) { return a.getBirthday().compareTo(b.getBirthday()); } } ComparisonProvidermyComparisonProvider=newComparisonProvider(); Arrays.sort(rosterAsArray, myComparisonProvider::compareByName);
위에 처럼 특정 객체를 만들어서 new 한후에 인스턴스 myComparisonProvider::compareByName 메소드 참조를 하였다.