JAVA - 람다와 스트림(3)

DevSeoRex·2022년 11월 4일
0
post-thumbnail

메서드 참조

람다식이 하나의 메서드만 호출하는 경우, '메서드 참조(method reference)'라는 방법으로
람다식을 더욱 간략히 할 수 있다.

// 일반 람다식
Function<String, Integer> f = (String s) -> Integer.parseInt(s);

// 메서드 참조
Function<String, Integer> f = Integer::parseInt;

메서드 참조에서는 람다식의 일부가 생략되었지만, 컴파일러가 생략된 부분을 우측의 parseInt( )
메서드의 선언부 또는 Function 인터페이스에 저장된 지네릭 타입으로부터 알아낼 수 있다.

매개변수가 2개인 메서드의 메서드 참조

// 메서드 참조 적용 전
BiFunction<String, String, Boolean> f = (s1, s2) -> s1.equals(s2);

//메서드 참조 적용 후
BiFunction<String, String, Boolean> f = String::equals;

참조변수인 f의 타입을 보면 두개의 String 타입의 매개변수를 받는 다는 것을 알 수 있으므로,
람다식의 매개변수들은 없어도 된다.

Boolean을 반환하는 equals라는 이름의 메서드는 다른 클래스에도 존재할 수 있으므로, equals 앞에 클래스
이름은 반드시 붙여줘야 한다.

생성된 객체의 메서드를 이용한 메서드 참조

MyClass obj = new MyClass();

// 람다식
Function<String, Boolean> f = (x) -> obj.equals(x);

// 메서드 참조
Function<String, Boolean> f = obj::equals;

이미 생성된 객체의 메서드를 람다식에서 사용할 경우에는 클래스 이름 대신 그 객체의 참조변수를 적어주면 된다.

생성자의 메서드 참조

생성자를 호출하는 람다식도 메서드 참조로 변환이 가능하다.

// 람다식
Suppllier<MyClass> s = () -> new MyClass();

// 메서드 참조
Supplier<MyClass> s = MyClass::new;

매개변수가 있는 생성자의 경우, 매개변수의 개수에 따라 알맞은 함수형 인터페이스를 사용하면 된다.

// 람다식
Function<Integer, MyClass> f = (i) -> new MyClass(i);

// 메서드 참조
Function<Integer, MyClass> f2 = MyClass::new;

// 매개변수 두 개 있는 생성자를 호출하는 람다식
BiFunction<Integer, String, MyClass> bf = (i, s) -> new MyClass(i, s);

// 매개변수 두 개 있는 생성자를 호출하는 메서드 참조
BiFunction<Integer, String, MyClass> bf2 = MyClass::new;

메서드 참조를 이용한 배열 생성

// 람다식
Function<Integer, int[]> f = x -> new int[x];

// 메서드 참조
Function<Integer, int[]> f2 = int[]::new;

메서드 참조를 이용하면 람다식을 마치 static 변수처럼 다룰 수 있게 해준다.

출처 : 자바의 정석 3rd(남궁성 저, 도우출판)

0개의 댓글