메소드 (메서드) 참조
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);
위처럼 간결하게 사용할 수 있다!!
기본 익명클래스 호출 원리
- merge의 3번째 파라미터에 익명함수를 구현한 인스턴스를 넘긴다
- merge함수 내부에서 구현된 익명함수인 .apply를 호출한다
- 구현된 apply에서 return Intger + Integer2를 반환한다
람다의 호출 원리
- 익명함수를 람다가 대신한다
- .apply호출시 람다가 count + incr를 반환한다.
메소드 참조 호출 원리
- 컴파일러가 메소드참조를 람다로 변환한다
- 위의 로직 수행
// 람다로 사용하기 위한 함수형 인터페이스 작성
@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 |