람다식이 하나의 메서드만 호출하는 경우에는 '메서드 참조'라는 방법을 사용하여 람다식을 더욱 간략히 할 수 있다. 예를 들어 문자열을 정수로 변한하는 람다식은 라애과 같이 작성한다.

	Function<String, Integer> f = (String s) -> Integer.parseInt(s);

이 람다식을 메서드로 표현하면 아래와 같다.

	Integer wrapper(String s) { // 함수 이름은 의미가 없다.
    	return Integer.parseInt(s);
    }

여기서 이 wrapper메서드는 사실상 하는일이 없다. 그저 값을 받아 Integer.parseInt에 인자를 전달하는 일 말고는 하지 않으니, 이 메서드를 벗겨내고 Integer.parseInt()만 직접 호출하는게 나아보인다.

	Function<String, Integer> f = (String s) -> Integer.parseInt(s);
    // ↓
    Function<String, Integer> f = Integer::parseInt; // 메서드 참조

위 메서드 참조에서 람다식의 일부분이 생략됐지만 컴파일시 컴파일러가 생략된 부분을 parseInt로부터 또는 Function인터페이스의 지정된 제네릭 타입으로부터 알아낸다.

참고 3번 특정 객체 인스턴스 참조는 거의 안쓴다.

하나의 메서드만 호출하는 람다식은 '클래스이름::메서드이름' 또는 '참조변수::메서드이름'으로 바꿀 수 있다.

생성자의 메서드 참조

생성자를 호출하는 람다식도 메서드 참조로 변환하여 간략하게 표기할 수 있다.

	Supplier<MyClass> s = () -> new MyClass(); // 람다식
    Supplier<MyClass> s = MyClass::new;	// 메서드 참조

매개변수가 있는 생성자라면, 매개변수의 개수에 따라 알맞은 함수형 인터페이스를 사용하면된다. 필요하다면 함수형 인터페이스를 새로 정의해야한다.(매개변수가 3개 이상이라면 보통.)

	Function<Integer, MyClass> f = (i) -> new MyClass(i); // 람다식
    Function<Integer, MyCLass> f2 = MyClass::new; // 생성자 메서드 참조
    
    BiFunction<Integer, String, MyClass> f = (i, s) -> new MyClass(i, s); // 람다식
    BiFunction<Integer, String, MyClass> f2 = MyClass::new; // 생성자 메서드 참조

그리고 배열을 생성할 떄는 아래와 같이 하면 된다.

	Function<Integer, int[]> f = x -> new int[x]; // 람다식
    Function<Integer, int[]> f2 = int[]::new; 메서드 참조

메서드 참조는 람다식을 마치 static변수처럼 다룰 수 있게 해준다. 메서드 참조는 코드를 간략히 하는데 유용하므로 변환하는 연습을 자주 하자.

0개의 댓글