티스토리 뷰
매서드 참조 표현식
이중 콜론 연산자(::)는 람다식의 파라미터로 사용된다. 매서드 참조 표현식(method reference expression)이라는 정식 이름을 갖고 있다.
인스턴스명::메서드명
위와 같은 표현 방식을 사용한다. 인스턴스를 반복 생성 시에도 사용할 수 있는데 이때는 아래와 같이 사용한다.
인스턴스명::new
스태틱 메서드인 경우 인스턴스 대신 클래스 이름으로 사용할 수 있다. 말보다 예시가 쉬운 경우 이므로 아래와 같이 작성해봤다.
public class TestMain {
public static void main(String[] args) {
List<String> list = Arrays.asList("aaa", "bbb", "ccc", "ddd");
list.stream().map(element -> element.toUpperCase())
.forEach(System.out::println);
}
}
AAA
BBB
CCC
DDD
스트림을 통해 모두 대문자로 만들고, 한줄씩 출력하는데 list의 모든 값들이 동일하게 들어간다. 위 :: 사용 부분은 아래와 같은 코드이다.
forEach(s -> System.out.println(s))
인스턴스들에도 비슷하게 적용된다. 간단한 Person 클래스를 하나 생성했다.
class Person {
private String name;
private int age;
public Person(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
이름 리스트를 생성하고 모두 대문자로 변환 후 출력하는 코드이다.
public class TestMain {
public static void main(String[] args) {
List<String> list = Arrays.asList("Kim", "Lee", "Choi", "Park");
List<Person> personList =
list.stream().map(element -> element.toUpperCase())
.map(Person::new)
.collect(Collectors.toList());
List<Person> personList2 =
list.stream().map(element -> element.toUpperCase())
.map(element -> new Person(element))
.collect(Collectors.toList());
personList.stream().forEach(person -> System.out.println(person.getName()));
personList2.stream().forEach(person -> System.out.println(person.getName()));
}
}
personList와 personList2는 동일한 동작을 한다.
재밌는점은 String name이 단일 파리머터로 들어가는 person의 생성자를 만들어주지 않으면, Person::new 해주는 부분에서 에러가 발생한다. 아래와 같이 생성자를 여러개 만들어도 알아서 매칭된다.
public Person(String name) {
this.name = name;
}
public Person(int age) {
this.age= age;
}
public Person(String name, int age) {
this.name = name;
this.age= age;
}
이중콜론으로 축약해도 알아서 생성자가 매칭된 다음에 객체가 생성된다는 점이 편리하다.
sorted를 사용할 때도 어떤 것이 기준이 될지 아래와 같이 이중콜론 표현식을 활용하여 만들 수 있다.
List<Person> personList3 = personList.stream().sorted(Comparator.comparing(Person::getName)).collect(Collectors.toList());
Comparator가 여기서도 등장하는데, Comparator 클래스에 대해서도 정리할 필요성이 느껴진다.
마치며
함수형 인터페이스 람다 내에서 활용할 수 있고, 가독성을 높여주는 활용성 높은 표현식이라 생각된다... 굳이 쓸말이 없다. 어려운 내용이 아니기 때문에
'개발 > JAVA' 카테고리의 다른 글
모던 자바 인 액션(Modern Java in Action). 1장 요약 (0) | 2023.01.29 |
---|---|
[Java] 리스트 객체 내 중복 제거(List to Set) (0) | 2023.01.26 |
[JAVA] Optional 클래스 (1) | 2023.01.26 |
[JAVA] Collectors (1) | 2023.01.26 |
[JAVA] Stream (1) | 2023.01.26 |
- Total
- Today
- Yesterday
- awskrug
- EKS
- 스프링부트
- CloudFront
- java
- AWS
- GIT
- AWS EC2
- 람다
- OpenAI
- terraform
- AOP
- S3
- serverless
- MySQL
- lambda
- docker
- Spring
- openAI API
- Elastic cloud
- Log
- elasticsearch
- JWT
- Kotlin
- ChatGPT
- 인프런
- cache
- chat GPT
- OpenFeign
- springboot
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |