[Java] Lambda - Method Reference

반응형

이번 글에서는 lambda의 method refernece에 대해 알아보도록 하겠습니다.

1. Method Reference

lambda에서 method reference를 사용하면, 조금 더 간결하게 코드를 작성할 수 있습니다. 😎

1-1) lambda

예를 들어 다음과 같이 작성한 lambda 식이 있을때

public class MethodReferenceExample {
    public static void main(String[] args) {
        Thread thread = new Thread(() -> printMessage());
        thread.start();
    }

    public static void printMessage() {
        System.out.println("Hello World!");
    }
}

위의 lambda 식은 thread가 printMessage 함수를 execution 하도록 동작합니다.

"이때 input parameter는 없으며, printMessage 메서드를 호출하고, printMessage의 input parameter도 존재하지 않습니다."

1-2) method reference

위의 lambda식에 method reference를 적용하면 아래와 같이 변경할 수 있습니다.

public class MethodReferenceExample {
    public static void main(String[] args) {
        Thread thread = new Thread(MethodReferenceExample::printMessage);
        thread.start();
    }

    public static void printMessage() {
        System.out.println("Hello World!");
    }
}

위의 코드는 이전과 동일한 결과값을 출력합니다.

기존에 input parameter & method & method parameter를 일일이 작성했던 lambda 식을 개선해, 단순히 lambda 식에서 호출하려고 하는 method가 무엇인지만 전달해 작업을 수행하는 것 입니다.

위의 lambda는, MethodReferenceExample의 printMessage를 호출하는 역할을 수행한다고 이해할 수 있습니다.

조금더 general 하게 해석해보면 method reference로 작성한 lambda식은 전달받은 input parameter를 reference한 method에 input 값으로 입력하고, 해당 method를 호출합니다. 😅

위의 예제에서는 input parameter가 존재하지 않으므로, printMessage에 input 값으로 아무것도 입력하지 않고 printMessage를 호출합니다.

• No Arguments -> calling a method with No Arguments

• A Arguments -> calling a method with A Arguments

• A , B Arguments -> calling a method with A , B Arguments

반드시 input parameter와 호출하는 method의 method paramter가 동일해야 method reference를 적용할 수 있습니다.

1-3) exercise

이전 글의 performConditionally에 작성된 lambda를 method reference로 변경해보겠습니다.

public class Exercise {
    public static void main(String[] args) {
        List<Person> people = Arrays.asList(
                new Person("Charles", "Dickens", 60),
                new Person("Lewis", "Carroll", 42),
                new Person("Thomas", "Carlyle", 51),
                new Person("Charlotte", "Bronte", 45),
                new Person("Matthew", "Arnold", 39)
        );

        // lambda
        printConditionally(people, (p) -> true, p-> System.out.println(p));
    }

    private static void printConditionally(List<Person> people, Predicate<Person> condition, Consumer<Person> action) {
        for (Person p : people) {
            if (condition.test(p)) {
                action.accept(p);
            }
        }
    }
}

위의 코드에서 performConditioanlly의 Consumer에 전달된 lambda는 다음과 같습니다.

consumer는 input을 입력받고 -> 동작을 수행한뒤 -> void를 return 하는 'functional interface' 입니다.

어떻게 변경하면 좋을까요?! 😎

위의 lambda는

"input parameter로 p를 입력 받고, println 메서드를 호출하고, println 메서드의 input parameter로 p를 입력합니다."

따라서 아래의 조건을 성립하므로

• A Arguments -> calling a method with A Arguments

다음과 같이 변경할 수 있습니다. 👏👏👏

public class Exercise {
    public static void main(String[] args) {
        List<Person> people = Arrays.asList(
                new Person("Charles", "Dickens", 60),
                new Person("Lewis", "Carroll", 42),
                new Person("Thomas", "Carlyle", 51),
                new Person("Charlotte", "Bronte", 45),
                new Person("Matthew", "Arnold", 39)
        );

        // method reference
        printConditionally(people, (p) -> true, System.out::println);
    }

    private static void printConditionally(List<Person> people, Predicate<Person> condition, Consumer<Person> action) {
        for (Person p : people) {
            if (condition.test(p)) {
                action.accept(p);
            }
        }
    }
}

실행해보면 다음과 같이 정상 작동하는 것을 확인할 수 있습니다.


추천서적

 

이것이 자바다:신용권의 Java 프로그래밍 정복

COUPANG

www.coupang.com

파트너스 활동을 통해 일정액의 수수료를 제공받을 수 있음


반응형

'Java' 카테고리의 다른 글

[Java] Lambda - Stream  (0) 2020.08.17
[Java] Lambda - Foreach Iteration  (0) 2020.08.17
[Java] Lambda - This Reference  (0) 2020.08.16
[Java] Lambda - Closure  (0) 2020.08.16
[Java] Lambda - Exception Handling  (0) 2020.08.16

댓글

Designed by JB FACTORY