[Kotlin] 람다 총정리
2021. 6. 15. 09:05ㆍ모바일/Android_Kotlin
kotlin Lambda
FloatingActionButton fab = findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// Something
}
});
/**
* Interface definition for a callback to be invoked when a view is clicked.
*/
public interface OnClickListener {
/**
* Called when a view has been clicked.
*
* @param v The view that was clicked.
*/
void onClick(View v);
}
public void setOnClickListener(@Nullable OnClickListener l) {
if (!isClickable()) {
setClickable(true);
}
getListenerInfo().mOnClickListener = l;
}
자바에서의 람다식
fab.setOnclickListener(view->
// Something
)
코틀린에서의 람다식
fab.setOnClickListener { /* Something */ }
Kotlin에서 제공하는 SAM(Single Abstract Method) 정의에 의해 동작하고 있다.
run
val sum = { x: Int, y: Int -> x + y }
println(sum(1, 2))
run { println(42) }
출처: https://tourspace.tistory.com/110 [투덜이의 리얼 블로그]
코드의 간결성을 위해 아래와 같은 규칙도 존재합니다.
- 함수의 맨 마지막 인자가 람다라면 () 안에서 빼내서 밖에 람다를 표현할 수 있다.
- 인자가 하나라면 그 인자는 람다식 내부에서 it으로 받을 수 있다.
- 인자가 하나이면서 그 인자가 람다타입 이라면 ()를 생략할 수 있다.
Lambda의 closure
코틀린의 람다는 자바의 closure와 개념이 좀 다릅니다.
자바에서는 lambda가 함수내부에서 실행될때, 로컬 변수에 접근하기 위해서는 해당 변수의 값이 final이어야만 합니다.
이는 stack 영역에 로컬변수의 메모리가 잡히고, 함수의 소멸과 함께 stack에서 날아가기 때문입니다.
final인 경우 해당 변수값을 복사해서 lambda 내부에서 사용하며, 이를 lambda capturing이라고 합니다.
member reference
람다를 넘길때 property나 다른 함수가 같은 signature를 가지고 있다면 간단하게 ::로 표현할 수 있습니다.
::를 사용하여 표현하는 방법은 총 네가지 입니다.
클래스의 멤버 표현
people.maxBy {Person::age}
표현식) 클래스이름::멤버변수
Extension function
확장함수도 람다식을 이용하여 표현할 수 있습니다.
//확장함수
fun Person.isAdult() = this.age >= 20
val predicate = Person::isAdult
표현식) 클래스::함수
함께면 좋은 글(Kotlin-Higher-Order-Function)
https://jhy156456.tistory.com/entry/kotlin-High-Order-Function
출처
'모바일 > Android_Kotlin' 카테고리의 다른 글
[kotlin] class, object, companion object (0) | 2021.06.17 |
---|---|
[kotlin] 함수 리터럴 (with receiver) (0) | 2021.06.17 |
RecyclerView Item 드래그 앤 드랍(Drag and Drop) 순서 변경 (0) | 2021.06.09 |
Generic 클래스와 함수 정리 (0) | 2021.06.04 |
[kotlin] 코루틴이란?, runBlocking?, suspendCancellableCoroutine (0) | 2021.06.03 |