💻IT/Java

[Java] Java 8 Method Reference (메소드 참조)

gom20 2021. 12. 12. 12:03

메소드 참조 (Method Reference)

 

메소드 참조는 람다 표현식의 특별한 타입중 하나이다.

이미 구현되어 있는 메소드를 참조함으로써, 람다식을 좀 더 심플하게 만들 때 사용된다.

4가지 타입의 메소드 참조가 있다. 

1. 정적 메소드 참조

문법

ContainingClass::staticMethodName

정적 메소드가 포함된 클래스::정적 메소드명 

 

예제

// 람다식으로 list의 원소 절대값 만들기
List<Integer> list = Arrays.asList(1, -5, 2, -7, -3);
list.stream().map(num -> Math.abs(num))
        .forEach(num -> System.out.println(num));

// 정적 메소드 참조로 변경
list.stream().map(Math::abs)
        .forEach(num -> System.out.println(num));

 

2. 특정 객체의 인스턴스 메소드 참조

문법

containingObject::instanceMethodName

메소드가 포함된 객체::메소드명

 

예제

class Node {
    public int x;
    public int y;

    public Node(int x, int y) {
        this.x = x;
        this.y = y;
    }

    public String toString(){
        return "x: " + x +", y: " + y;
    }
}

class NodeComparator implements Comparator<Node> {

    @Override
    public int compare(Node o1, Node o2) {
        return o1.x - o2.x;
    }
}
        List<Node> nodes = new ArrayList<Node>();
        nodes.add(new Node(3, 6));
        nodes.add(new Node(1, 3));
        nodes.add(new Node(6, 5));
        nodes.add(new Node(12, 2));

        NodeComparator nodeComparator = new NodeComparator();

        // 람다식으로 정렬
        nodes.stream().sorted((a, b) -> nodeComparator.compare(a, b))
                .forEach(node -> System.out.println(node.toString()));

        // 인스턴스 메소드 참조로 정렬
        nodes.stream().sorted(nodeComparator::compare)
                .forEach(node -> System.out.println(node.toString()));

 

 

3. 특정 유형의 임의 객체 메소드에 대한 참조

(Reference to an Instance Method of an Arbitrary Object of a Particular Type)

 

문법

ContainingType::methodName

타입::메소드명

 

예제

        List<String> words = Arrays.asList("ABC", "CD", "EFG");

        // 인자로 넘어온 객체의 메소드를 호출
        // 람다식으로 표현
        words.stream().map(word -> word.toLowerCase())
                .forEach(word -> System.out.println(word));

        // 메소드 참조로 표현
        words.stream().map(String::toLowerCase)
                .forEach(word -> System.out.println(word));

arbitary object (임의 객체)라는 용어가 사용된 이유는, 메소드 참조가 실행될 때마다 인자로 넘어온 객체가 다를 수 있기 때문이다. 

참고

https://stackoverflow.com/questions/23533345/what-does-an-arbitrary-object-of-a-particular-type-mean-in-java-8

 

What does "an Arbitrary Object of a Particular Type" mean in java 8?

In Java 8 there is "Method Reference" feature. One of its kind is "Reference to an instance method of an arbitrary object of a particular type" http://docs.oracle.com/javase/tutorial/java/javaOO/

stackoverflow.com

 

4. 생성자 참조

문법

ClassName::new

클래스명::new

 

예제

public class Node {
    int x;
    int y;
    public Node(int x, int y){
        this.x = x;
        this.y = y;
    }

    public String toString(){
        return "x:" + x+ ", y:"+y;
    }

}
// 람다식
BiFunction<Integer, Integer, Node> functionFunc1 = (a, b) -> new Node(a, b);
System.out.println(functionFunc1.apply(1, 3).toString());

// 생성자 참조
BiFunction<Integer, Integer, Node> functionFunc2 = Node::new;
System.out.println(functionFunc1.apply(5, 6).toString());

참고

https://docs.oracle.com/javase/tutorial/java/javaOO/methodreferences.html

https://www.baeldung.com/java-method-references

 

'💻IT > Java' 카테고리의 다른 글

[Java] Java 8 Functional Interface  (0) 2021.12.10
[Java] Java 8 Optional  (0) 2021.12.09
[Java] Java 8 Stream API  (0) 2021.12.03
[Java] Deque 자료 구조 (LinkedList 메소드)  (0) 2021.11.15
[Java] Convert Array to List / Convert List to Array  (0) 2021.10.18