메소드 (메서드) 참조

2020. 10. 24. 23:37모바일/Android_Java

메소드 참조란?

  • 이미 존재하는 이름을 가진 메소드를 람다로써 사용할 수 있도록 참조하는(가리키는) 역할을 합니다.
  • 메소드 참조로 코드를 작성하게 되면 컴파일러는 메소드를 참조를 보고 람다를 생성합니다. 사용법은 다음과 같습니다.
map.merge("1", 1, (count, incr) -> count + incr);

map.merge("1", 1, new BiFunction<Integer, Integer, Integer>() {
    @Override
    public Integer apply(Integer integer, Integer integer2) {
        return integer + integer2;
    }
});


default V merge(K key, V value,
                BiFunction<? super V, ? super V, ? extends V> remappingFunction) {
    Objects.requireNonNull(remappingFunction);
    Objects.requireNonNull(value);
    V oldValue = get(key);
    V newValue = (oldValue == null) ? value :
    remappingFunction.apply(oldValue, value);
    if (newValue == null) {
        remove(key);
    } else {
        put(key, newValue);
    }
    return newValue;
}


map.merge("1",1,Integer::sum);
위처럼 간결하게 사용할 수 있다!!

기본 익명클래스 호출 원리

  1. merge의 3번째 파라미터에 익명함수를 구현한 인스턴스를 넘긴다
  2. merge함수 내부에서 구현된 익명함수인 .apply를 호출한다
  3. 구현된 apply에서 return Intger + Integer2를 반환한다

람다의 호출 원리

  1. 익명함수를 람다가 대신한다
  2. .apply호출시 람다가 count + incr를 반환한다.

메소드 참조 호출 원리

  1. 컴파일러가 메소드참조를 람다로 변환한다
  2. 위의 로직 수행
// 람다로 사용하기 위한 함수형 인터페이스 작성
@FunctionalInterface
interface Conversion {
  String convert(Integer number);
}

// Conversion 을 사용하는 메소드
public static String convert(Integer number, Conversion function) {
  return function.convert(number);
}

// 메소드 참조를 동일한 람다로 변환하기 위한 충분한 정보를 제공함
// Convert 메소드를 호출할 때 람다를 인자로 넘겨줄 수 있다.
convert(100, (number) -> String.valueOf(number));

// valueOf() 메소드가 Integer 를 받고 String 을 반환하는 조건에 일치한다
// 따라서 메소드 참조로 대체할 수 있음
convert(100, String::valueOf);


convert(100, new Conversion(){
	@Override
    public String convert(Integer integer){
    	String.valueOf(integer);
    }
}

참조 : https://futurecreator.github.io/2018/08/02/java-lambda-method-references/

'모바일 > Android_Java' 카테고리의 다른 글

슬라이딩 업 레이아웃(SlidingUpPanelLayout) 구현일기..  (0) 2020.11.07
Android Traget변경 Android 10, TargketSdkVersion29  (0) 2020.11.04
함수형 인터페이스  (0) 2020.10.24
자바 용어정리  (0) 2020.10.24
Glide란?  (0) 2020.10.12