[자바의 정석] 14. 람다와 스트림 - 메서드 참조(method reference)

jyleever·2022년 9월 25일
0

자바의 정석

목록 보기
7/12
post-thumbnail
post-custom-banner

하나의 메서드만 호출하는 람다식은 '메서드 참조'로 더 간단히 할 수 있다.
즉, 람다식을 더 간단히 만든 것이 메서드 참조
클래스명::메서드명

  • static 메서드 참조
    람다 : (x) ->ClassName.method(x)
    메서드 참조 : ClassName::method

  • 인스턴스 메서드 참조
    람다 : (obj, x) -> obj.method(x)
    메서드 참조 : ClassName::method

  • 특정 객체 인스턴스 메서드 참조 (거의 안 씀, 잊어도 됨~)
    람다 : (x) -> obj.method(x)
    메서드 참조 : obj::method

static 메서드 참조

Integer method(String s){ // 이 메서드가 하는 일이 그저 Integer.parseInt(String s)만 호출
	return Integer.parseInt(s);
}
int result = Integer.parseInt(s); 이렇게 사용해도 됨
즉 람다식으로 바꾸면
Function<String, Integer> f = (String s) -> Integer.parseInt(s);

-여기서 (String s) 정보는 없어도 된다. 어차피 Function<String, Integer> 에서
반환타입이 String 이라는 것을 알고 있기 때문(함수형 인터페이스에 정보가 다 있기 때문)
따라서 String s 삭제
pareInt의 매개변수가 1개인 것은 모두 알고 있으므로 매개변수 s도 삭제
Function<String, Integer> f = Integer::parseInt; // 메서드 참조

메서드 참조식을 람다식으로 바꾸는 연습을 해야 한다
람다식의 입출력이 무엇인지 적어가면서 채우면 된다.
매개변수가 몇 개인지 등을 알고 싶다면 자바 api등을 찾아보자
이해가 안 되면 그림도 그려보고..
Integer::parseInt → (String s) -> Integer.parseInt(s)

생성자의 메서드 참조

Supplier<MyClass> s = () -> new MyClass();

supplier는 입력은 없고 출력만 있다.
따라서 여기서 MyClass 타입은 입력이 아닌 출력 타입
다음과 같이 바꿀 수 있다.

- 입력 없음
- new MyClass();
Supplier<MyClass> s = MyClass::new

예시

Function<Integer, MyClass> s = (i) -> new MyClass(i);
- 입력값 타입 알고 있음
- 반환값 타입 알고 있음
- 생략 가능 -> 결국 남은 것은 new MyClass();
Function<Integer, MyClass> s = MyClass()::new;

배열과 메서드 참조

배열 타입[] :: new

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

배열은 꼭 Function 메서드.. 배열의 크기를 입력해야 하기 때문

post-custom-banner

0개의 댓글