-
Method Reference (Java 8)JAVA/Java 2021. 12. 19. 13:01
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
'JAVA > Java' 카테고리의 다른 글
Java Optional의 사용 (0) 2022.01.06 자바에서 static의 사용 (0) 2021.12.30 Refactoring ① : 첫번째 예제 (0) 2021.12.17 DTO와 VO 그리고 Entity (0) 2021.12.13 Setter의 사용 금지 (0) 2021.12.13