Kotlin 고급 함수 와 Lambda 표현 식 상세 설명
고급 함수(higher-order function)는 특수 한 함수 입 니 다.함 수 를 매개 변수 로 받 아들 이거 나 함수 로 되 돌려 줍 니 다.이 함수 의 좋 은 예 는 lock()함수 입 니 다.그 매개 변 수 는 자물쇠 대상(lock object)과 다른 함수 입 니 다.먼저 자 물 쇠 를 가 져 오고 대상 함 수 를 실행 한 다음 에 자 물 쇠 를 풀 어 줍 니 다.
fun <T> lock(lock: Lock, body: () -> T): T {
lock.lock()
try {
return body()
}finally {
lock.unlock()
}
}
위의 코드:body 인 자 는 함수 형식 입 니 다.()->T 이기 때문에 함수 일 것 입 니 다.이 함 수 는 인자 가 없 으 면 T 형식의 값 을 되 돌려 줍 니 다.고급 함수 C 언어 와 유사 한 함수 포인터,고급 함수 다른 예:
fun <T, R> List<T>.map(transform: (T) -> R): List<R> {
val result = arrayListOf<R>()
for (item in this)
result.add(transform(item))
return result
}
val doubled = ints.map { it -> it * 2 } //
함수 유형(함수 유형)다른 함 수 를 자신의 매개 변수 로 받 아들 이 는 함수 에 대해 우 리 는 이 매개 변수 에 대해 함수 유형 을 지정 해 야 합 니 다.예 를 들 어 앞의 맵 함수,매개 변수 transform 의 유형 은(T)->R 입 니 다.이것 은 함수,매개 변수 T,R 을 되 돌려 주 는 것 을 의미 합 니 다.
함수 참조 및 되 돌려 주기
고급 함 수 는 함수 인 자 를 받 아들 일 수도 있 고 함수 인용 을 되 돌려 줄 수도 있 습 니 다.함 수 는 변 수 를 부여 할 수 있 습 니 다.C 언어의 함수 포인터 와 같 습 니 다.
fun bar(): (String) -> String = { str -> str.reversed() }
val reversi = bar()
reversi("hello")
reversi("world")
내 연 함수(인 라인 함수)Kotlin 은 내 연 함 수 를 지원 합 니 다.함수 내 연 은 컴 파일 로 인 한 코드 크기 가 커 질 수 있 습 니 다.그러나 우리 가 합 리 적 으로(내 연 이 너무 큰 함 수 를 사용 하지 마 세 요)를 사용 하면 성능 을 향상 시 킬 수 있 습 니 다.
inline fun foo() {
//
}
만약 내 연 함수 의 매개 변수 에 여러 개의 Lambda 표현 식 이 있다 면,내 연 된 일부분 만 을 원한 다 면,함수 의 일부 매개 변수 에 noinline 표 시 를 추가 할 수 있 습 니 다.
inline fun foo(inlined: () -> Unit, noinline notInlined: () -> Unit) {
// ...
}
Lambda 표현 식Lambda 표현 식 의 전체 문법 형식,예 를 들 어:
val sum = { x: Int, y: Int -> x + y }
Lambda 표현 식 은 대괄호 안에 포함 되 어 있 습 니 다.전체 문법 형식 에서 매개 변 수 는 괄호 안에 있 습 니 다.매개 변수 형식의 성명 은 선택 할 수 있 습 니 다.함수 체 는->기호 뒤에 있 습 니 다.Lambda 표현 식 이 자동 으로 추정 하 는 반환 값 형식 이 Unit 이 아니라면 Lambda 표현 식 함수 체 에서 마지막(또는 유일한)표현 식 의 값 입 니 다.전체 Lambda 표현 식 의 반환 값 으로 사 용 됩 니 다.많은 경우 Lambda 표현 식 은 유일한 매개 변수 만 있 습 니 다.Kotlin 이 Lambda 표현 식 의 매개 변수 정 의 를 스스로 판단 할 수 있다 면 유일한 매개 변수 정 의 를 생략 하고 이 매개 변 수 를 은밀 하 게 정의 할 수 있 습 니 다.사용 하 는 매개 변 수 는 it 입 니 다.
ints.filter { it > 0 }
탭 이 한 정 된 return 문법 을 사용 하면 Lambda 표현 식 에서 결과 값 을 명확 하 게 되 돌려 줄 수 있 습 니 다.그렇지 않 으 면 Lambda 표현 식 의 마지막 표현 식 값 을 은근히 되 돌려 줍 니 다.
ints.filter {
val shouldFilter = it > 0
return@filter shouldFilter
}
익명 함수(익명 함수)익명 함 수 는 일반적인 함수 성명 과 유사 해 보이 는데 함수 명 을 생략 한 것 과 구별 된다.
fun(x: Int, y: Int): Int = x + y
매개 변수 와 반환 값 형식의 성명 은 일반적인 함수 와 같 지만 매개 변수 형식 이 문맥 을 통 해 추정 된다 면 형식 성명 은 생략 할 수 있 습 니 다.
ints.filter(fun(item) = item > 0)
폐쇄 하 다패 킷 이란 하나의 코드 블록 이 외부 역할 영역 에 접근 할 수 있 는 변수 와 매개 변수 입 니 다.예 를 들 어 위 에서 언급 한 Lambda 표현 식 과 익명 함수 입 니 다.
var containsNegative = false
val ints = listOf(0, 1, 2, 3, 4, 5)
ints.forEach {
if (it < 0)
containsNegative = true
}
읽 어 주 셔 서 감사합니다. 여러분 에 게 도움 이 되 기 를 바 랍 니 다.본 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
머티리얼 디자인 도입 직후에 할 일안드로이드 프로젝트에 머티리얼 디자인을 도입한 후에 할 일을 적는다. Android 프로젝트를 만든 후 Hello world에 대해 수행합니다. 머티리얼 디자인을 도입하기 위해, build.gradle 를 이하와 같...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.