이중 콜론 연산자 (Double Colon Operator) 는 Java 8 에서 추가된 메소드 참조 연산자이다.
람다식에서 파라미터를 중복해서 사용하고 싶지 않을 때 사용하고,
람다식과 동일한 처리 방법을 갖긴 하지만, 이름으로 기존 메소드를 참조함으로써 더욱 보기 쉽게 사용할 수 있다
[인스턴스]::[메소드명(or new)]
ex) User::getId
① 람다 표현식 () -> {}
에서만 사용 가능하고
② static 메소드인 경우 인스턴스 대신 클래스 이름으로 사용할 수도 있다 !
자세한 건 예시를 통해서 더 알아보자
리스트를 순회하면서 String 을 대문자로 바꿔주고자 할 때
List<String> testList = Arrays.asList("one", "two", "three", "four");
testList = testList
.stream()
.map(a -> a.toUpperCase()) // 람다 표현식
.collect(Collectors.toList());
testList = testList
.stream()
.map(String::toUpperCase) // 이중 콜론 연산자 사용
.collect(Collectors.toList());
a -> a.toUpperCase() 를 이중 콜론 연산자로 표현하려면 String::toUpperCase 로 나타낼 수 있다
특정 Dto 리스트에서 아이디만 뽑을 때
@Getter
@AllArgsConstructor(staticName = "of")
public class TestDto {
private Long id;
private String name;
}
List<TestDto> testDtoList = new ArrayList<>();
testDtoList.add(TestDto.of(1L, "첫번째"));
testDtoList.add(TestDto.of(2L, "두번째"));
// 람다 표현식
testDtoList.stream().map(a->a.getId()).collect(Collectors.toList());
// 이중 콜론 연산자 사용
testDtoList.stream().map(TestDto::getId).collect(Collectors.toList());
static 메소드를 사용할 때
@Getter
@AllArgsConstructor(staticName = "of")
public class NameDto {
private String name;
}
List<String> testList = Arrays.asList("one", "two", "three", "four");
// 람다 표현식
testList.stream().map(a->NameDto.of(a)).collect(Collectors.toList())
// 이중 콜론 연산자 사용
testList.stream().map(NameDto::of).collect(Collectors.toList())
위의 예시처럼 여러 방면으로 활용할 수 있고, 이를 통해 코드 양을 줄이고 가독성을 올려 줄 수 있다.
굳이 수동으로 이중 콜론 연산자로 수정하지 않더라도 람다 표현식으로만 표현했을 때 인텔리제이에서 제안해주기 때문에 Replace lambda with method reference
를 눌러서 변경해주면 쉽게 변경 가능하다 !!!
안녕하세요 좋은글 잘 보고 갑니다. 그런데 섬네일 이렇게 깔끔하게 만드는 방법이 무엇인지 알려주실 수 있나요 ?