Kotlin 고급 함수 와 Lambda 표현 식 상세 설명

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
}


읽 어 주 셔 서 감사합니다. 여러분 에 게 도움 이 되 기 를 바 랍 니 다.본 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!

좋은 웹페이지 즐겨찾기