본문 바로가기
자바

Lamda Method Reference

by 이상한나라의개발자 2024. 1. 31.

람다 메서드 래퍼런스는 람다 표현식을 더 간결하게 표현하는 방법 중 하나입니다. 메서드 래퍼런스를 사용하면 기존 메서드 호출하는 람다 표현식을 좀 더 짧고 가독성 있게 표현할 수 있습니다. 메서드 참조는 메서드명 앞에 구분자 (::)를 붙이는 방식으로 메서드 참조를 활용할 수 있다. 결과적으로 메서드 참조란 람다 표현식 ( 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