람다 메서드 래퍼런스는 람다 표현식을 더 간결하게 표현하는 방법 중 하나입니다. 메서드 래퍼런스를 사용하면 기존 메서드 호출하는 람다 표현식을 좀 더 짧고 가독성 있게 표현할 수 있습니다. 메서드 참조는 메서드명 앞에 구분자 (::)를 붙이는 방식으로 메서드 참조를 활용할 수 있다. 결과적으로 메서드 참조란 람다 표현식 ( s -> System.out.println(s") ) 를 축약한 것이다. 이런 메서드 래퍼런스 방식은 IntelliJ 같은 툴을 활용하면 자동으로 변환하여 준다.
기존 코드
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
names.forEach(s -> System.out.println("s = " + s));
메소드 래퍼런스 코드
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
names.forEach(System.out::println);
람다 메서드 래퍼런스 유형
메서드 참조는 크게 세 가지 유형으로 구분할 수 있다. 정적 메서드 참조, 다양한 형식의 인스턴스 메서드 참조, 기존 객체의 인스턴스 메서드 참조
정적 메서드 래퍼런스 ( Static Method Reference )
클래스의 static method를 지정할 때 사용됩니다. 예를 들어, Integer 클래스의 parseInt 메서드를 람다 메서드 래퍼런스로 표현하면 다음과 같습니다.
Integer::parseInt // 클래스명::정적메서드
Function<String, Integer> strToInt = Integer::parseInt;
int five = strToInt.apply("5");
인스턴스, 클래스 메서드 래퍼런스 ( Instance, class Method Reference )
선언 된 객체의 instance method를 지정할 때 사용됩니다. 예를 들어, 문자열 길이를 반환하는 length 메서드를 람다 메서드로 표현하면 다음과 같습니다.
해당 클래스의 인스턴스를 매개변수(parmeter)로 넘겨 메서드를 실행해주는 함수
String::length // 클래스명::인스턴스메서드
User::getId. // 인스턴스명::인스턴스메서드
public class MethodReferenceExam {
public static void main(String[] args) {
Function<String, Integer> strLength = String::length;
int length = strLength.apply("Hello");
BiPredicate<String, String> strEqual = String::equals;
boolean result = strEqual.test("hello", "world");
List<User> users = List.of(User.builder().id(1L).name("name1").build(),
User.builder().id(2L).name("name2").build(),
User.builder().id(3L).name("name3").build());
// 기존 람다 표현식
Function<User, Object> getId = user -> user.getId();
// 메서들 레퍼런스 활용
Function<User, Object> getId2 = User::getId;
printUser(users, getId);
}
private static void printUser(List<User> user, Function<User, Object> function) {
for (User u : user) {
System.out.println("function.apply(u) = " + function.apply(u));
}
}
@Data
@Builder
static class User {
private Long id;
private String name;
}
}
생성자 래퍼런스 ( Constructor Reference )
클래스의 constructor을 지정할 때 사용 됩니다. 예를 들어, User 클래스의 생성자를 람다 메서드 래퍼런스로 표현하면 다음과 같습니다.
User::new // 클래스명::new
public class MethodReferenceExam3 {
public static void main(String[] args) {
BiFunction<Long, String, User> function = (l, s) -> User.builder()
.id(l)
.name(s)
.build();
System.out.println("function.apply(1L, \"name1\") = " + function.apply(1L, "name1"));
BiFunction<Long, String, User> function2 = User::new;
System.out.println("function2 = " + function2.apply(2L, "name1"));
}
@Getter
@Setter
@ToString
@NoArgsConstructor
static class User {
private Long id;
private String name;
@Builder
public User(Long id, String name) {
this.id = id;
this.name = name;
}
}
}
'자바' 카테고리의 다른 글
Optional<T> (0) | 2024.02.06 |
---|---|
Stream API (0) | 2024.02.02 |
Java Lamda 표현식과 Stream API (1) | 2024.01.31 |
함수형 프로그래밍과 일급객체 (0) | 2024.01.31 |
내부 클래스 ( inner class ) 란? (0) | 2024.01.02 |