JAVA/Java

Method Reference (Java 8)

dodop 2021. 12. 19. 13:01

 

 

Method Reference 는 람다식을 더 간결하게 표현하기 위한 방법이다. 

 

 

 

 

Method Reference

메소드 레퍼런스에는 3가지 방법이 존재한다. 

  1.  정적 메소드 참조 (Static Method Reference)
  2.  인스턴스 메서드 참조 (Instance Method Reference)
  3.  생성자 참조 (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

 

[Java8] Method Reference (메서드 참조) - 생성 방법

Method Reference를 이해하려면 Lambda를 먼저 이해해야한다. 여기서는 Lambda식을 Method Reference로 변경하는 방법을 다룬다. Lambda식을 사용하다보면 IDE에서 친절하게 노란색으로 Method Reference로 바꾸지..

countryxide.tistory.com

https://codechacha.com/ko/java8-method-reference/

 

Java8 - 메소드 레퍼런스(Method Reference) 이해하기

메소드 레퍼런스(Method Reference)는 Lambda 표현식을 더 간단하게 표현하는 방법입니다. 메소드 레퍼런스는 사용하는 패턴에 따라 다음과 같이 분류할 수 있습니다. Static 메소드 레퍼런스, Instance 메

codechacha.com

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