Method Reference (Java 8)
Method Reference 는 람다식을 더 간결하게 표현하기 위한 방법이다.
Method Reference
메소드 레퍼런스에는 3가지 방법이 존재한다.
- 정적 메소드 참조 (Static Method Reference)
- 인스턴스 메서드 참조 (Instance Method Reference)
- 생성자 참조 (Contructor Reference)
정적 메소드 참조
List<String> fruits = Arrays.asList("apple", "banana", "kiwi");
//람다식 표현
fruits.forEach(fruit -> StringUtils.capitalize(fruit));
//메소드 레퍼런스 표현
fruits.forEach(StringUtils::capitalize);
//출력 결과
Apple Banana Kiwi
정적 메소드는 static 메소드를 레퍼런스로 사용하는 것이다. 여기서 StringUtils.capitalize 메소드가 static 메소드이다.
인스턴스 메소드 참조
인스턴스 메소드 참조에는 두가지 방법이 존재한다.
① 특정 객체의 인스턴스 메서드 참조 -> 객체 레퍼런스 :: 인스턴스 메소드
② 임의 객체의 인스턴스 메서드 참조 -> 타입 :: 인스턴스 메소드
public class Card {
private String shape;
private Integer number;
}
public class CardComparator implements Comparator {
@Override
public int compare(Card a, Card b) {
return a.getNumber().compareTo(b.getNumber());
}
}
CardComparator cardNumberComparator = new CardComparator();
//람다식 표현
cardList().stream()
.sorted((a, b) -> cardNumberComparator.compare(a, b));
//메소드 레퍼런스 표현
cardList().stream()
.sorted(cardNumberComparator::compare);
첫번째로 특정 객체의 인스턴스 메소드 참조하려는 경우 특정 객체 레퍼런스::인스턴스 메소드 (Ex)cardNumberComparator::compare )의 형식으로 만들 수 있다.
List<Integer> numbers = Arrays.asList(5, 6, 2, 8, 20, 29);
//람다식 표현
numbers.stream()
.sorted((a, b) -> a.compareTo(b));
//메소드 레퍼런스 표현
numbers.stream()
.sorted(Integer::compareTo);
두번째로 임의의 객체 인스턴스 메소드를 참조하려는 경우에는 객체 리턴타입::인스턴스 메소드 (Ex)Integer::compareTo)의 형식으로 만들 수 있다.
생성자 참조
List<String> cardShapes = Arrays.asList("Diamond", "Heart", "Club", "Spade");
public Card(String shape) {
this.shape = shape;
this.number = 1;
}
//람다식 표현
cardShpaes.stream()
.map(shape -> new Card(shape))
.toArray(new Card[0]);
//메서드 레퍼런스 표현
cardShpaes.stream()
.map(Card::new)
.toArray(Card[]::new);
생성자 참조는 static 메서드 참조와 비슷하며 다른 점은 new키워드를 이용하여 새로운 객체를 생성한다는 것이다.
메서드 레퍼런스를 이용함으로서 람다식으로 작성된 코드를 조금 더 간결하게 작성할 수 있다.
(참조한 사이트)
https://www.baeldung.com/java-method-references
https://countryxide.tistory.com/127
https://codechacha.com/ko/java8-method-reference/
https://velog.io/@dnstlr2933/%EB%A9%94%EC%86%8C%EB%93%9C-%EB%A0%88%ED%8D%BC%EB%9F%B0%EC%8A%A4