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 |