String collect = memberList.stream().map(Member::getName).collect(Collectors.joining());

Java 8 이상에서 람다식을 사용할 때 클론 2개를 사용하는 경우가 있습니다. 이를 메서드 참조(Method Referentce) 혹은 이중 클론 연산자(::)라고 표현한다.

 

메서드 참조는 언제, 어떻게 사용할까

 

메서드 참조는 람다식에서 파라미터의 중복을 피하기 위해 사용한다. 파라미터가 중복되지 않았다면 메서드 참조 표현식은 사용 불가능하다.

 

인스턴스의 메서드를 참조하는 경우

package com.board.study.repository;

import java.lang.reflect.Member;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class main {
    public static void main(String[] args) {
        List<Member> memberList = Arrays.asList(new Member("A"), new Member("B"), new Member("C"));

        String collect = memberList.stream().map(element -> element.getName()).collect(Collectors.joining());
        System.out.println(collect);
    }

    public static class Member {

        private String name;

        public Member(String name) {
            this.name = name;
        }

        public String getName() {
            return name;
        }
    }
    
}

 

 

위 코드에서 stream 생성 이후 map 메서드에서 람다식을 사용했습니다. 이 때 map에 걸리는 요소들은 Member 인스턴스이다. 그리고 map 내부에서 인스턴스의 메서드인 getName()을 호출하고 있다.

 

그런데 문제는 요소를 지칭하는 element가 두 번이나 등장한다. 그래서 람다식을 메서드 참조 표현식으로 변경해보면 다음과 같다.

 

 

일반 람다식 

String collect = memberList.stream().map(element -> element.getName()).collect(Collectors.joining());

 

메서드 참조 표현식

String collect = memberList.stream().map(Member::getName).collect(Collectors.joining());

 

일반 람다식

(인스턴스 -> 인스턴스.메서드명)

 

메서드 참조 표현식

(인스턴스의 클래스명::메서드명)

 

 

 

인스턴스를 생성하는 경우

package com.board.study.repository;

import java.lang.reflect.Member;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class main {
    public static void main(String[] args) {
        List<String> memberNameList = List.of("A", "B", "C");
        List<Member> memberList = memberNameList.stream().map(name -> new Member(name)).collect(Collectors.toList());
        memberList.forEach(member -> System.out.println(member.getName()));
    }

    public static class Member {

        private String name;

        public Member(String name) {
            this.name = name;
        }

        public String getName() {
            return name;
        }
    }

}

위 코드에서 memberList를 초기화할 때 stream 생성 이후 map 메서드에서 람다식을 사용했다. 이때 map에 걸리는 요소들은 String 객체지만, Member 클래스의 인스턴스를 만들 때 인자로 들어간다. 이때도 메서드 참조 표현식이 가능하다.

 

 

일반 람다식

List<Member> memberList = memberNameList.stream().map(name -> new Member(name)).collect(Collectors.toList());

 

메서드 참조 표현식

List<Member> memberList = memberNameList.stream().map(Member::new)).collect(Collectors.toList());

위 코드에서 메서드 참조 표현식의 사용 형태는 다음과 같다. 특히, 이렇게 메서드가 아닌 생성자를 참조할 때는 생성자 참조 표현식이라고 부른다.

 

 

 

일반 람다식 

(인자로 들어갈 객체 -> new 클래스명(인자로 들어갈 객체))

 

메서드 참조 표현식

(클래스명::new)

 

 

'JAVA > Chapter14' 카테고리의 다른 글

JAVA - Supplier  (0) 2022.09.08
JAVA - orElse, orElseGet  (0) 2022.09.08
Java - ::(더블콜론)  (0) 2022.08.30
Java 입출력(I/O), 스트림(Stream), 버퍼(Buffer) 개념 및 사용법  (0) 2022.08.25
OutputStream 정의  (0) 2022.08.25
복사했습니다!