반응형
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 = Integer::parseInt; //메서드참조
컴파일러는 생략된 부분을 우변의 parseInt메서드의 선언부로부터, 또는 좌변의 Function 인터페이스에 지정된 제네릭 타입으로부터 쉽게 알아낼 수 있다.
또 다른 예시를 보면 아래와 같이 메소드 참조로 표현 할 수 있다.
BiFunction<String, String, Boolean> f = (s1, s2) -> s1.equals(s2);
BiFunction<String, String, Boolean> f = String::equals;
이 외에도 메서드 참조를 사용할 수 있는 경우가 한 가지 더 있는데, 이미 생성된 객체의 메서드를 람다식에서 사용한 경우에는 클래스 이름 대신 그 객체의 참조변수를 적어줘야 한다.
MyClass obj = new MyClass();
Function<String, Boolean> f = (x) -> obj.equals(x); //람다식
Function<String, Boolean> f2 = obj::equals; //메서드 참조
static 메서드 참조 | (x) -> ClassName.method(x) | ClasssName::method |
인스턴스 메서드 참조 | (obj, x) -> obj.method(x) | ClassName::method |
특정 객체 인스턴스메서드 참조 | (x) -> obj.method(x) | obj::method |
하나의 메서드만 호출하는 람다식은 '클래스이름::메서드이름' 또는 '참조변수::메서드이름' 으로 변경할 수 있다.
생성자 메서드 참조
Supplier<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[]> f = int[]::new;
참고 : 자바의정석
반응형
'DEV > Java' 카테고리의 다른 글
[자바] java.util.function 패키지 (7) | 2023.03.03 |
---|---|
[자바] 제네릭 Parameter Type - Naming Conventions (8) | 2023.02.24 |
[자바] 함수형 인터페이스(Functional Interface) (5) | 2023.02.22 |
[자바] 람다식(Lambda expression) (1) | 2023.02.22 |
[자바] 제네릭 와일드 카드 (9) | 2023.02.16 |
댓글