룬아님의 취중코딩

Kotlin Bootcamp for Programmers 8. 람다와 고차함수 본문

개발/Kotlin

Kotlin Bootcamp for Programmers 8. 람다와 고차함수

룬아님 2019. 10. 15. 14:31

you get an introduction to lambdas and higher-order functions in Kotlin.

 

Higher-Order Functions and Lambdas - Kotlin Programming Language

 

kotlinlang.org

 

Step 1: Learn about lambdas

1. 명명 된 함수와 마찬가지로 람다는 매개 변수를 가질 수 있습니다. 람다의 경우 매개 변수 (및 필요한 경우 유형)는 기능 화살표->의 왼쪽에 있습니다. 실행할 코드는 기능 화살표의 오른쪽으로갑니다. 람다가 변수에 할당되면 함수처럼 호출 할 수 있습니다.

var dirtyLevel = 20
val waterFilter = { dirty : Int -> dirty / 2}
println(waterFilter(dirtyLevel))
⇒ 10

이 예제에서 람다는 dirty라는 Int를 가져오고 dirty / 2를 반환합니다.

 

2. 함수 유형에 대한 Kotlin의 구문은 람다에 대한 구문과 밀접한 관련이 있습니다. 이 구문을 사용하여 함수를 보유한 변수를 명확하게 선언하십시오.

val waterFilter: (Int) -> Int = { dirty -> dirty / 2 }

코드는 다음과 같습니다.

  • waterFilter라는 변수를 만듭니다.
  • waterFilter는 Int를 가져 와서 Int를 반환하는 모든 함수일 수 있습니다.
  • waterFilter에 람다를 할당하십시오.
  • 람다는 dirty 인수를 2로 나눈 값을 반환합니다.

더 이상 람다 인수의 유형을 지정할 필요가 없습니다. 유형은 유형 유추에 의해 계산됩니다.

 

 

Step 2: Create a higher-order function

지금까지 람다에 대한 예제는 대부분 함수처럼 보입니다. 람다의 진정한 힘은 그것들을 사용하여 고차 함수를 만드는 것입니다. 한 함수에 대한 인수는 다른 함수입니다.

1. 고차 함수를 작성하십시오. 다음은 두 가지 인수를 취하는 함수의 기본 예입니다. 첫 번째 인수는 정수입니다. 두 번째 인수는 정수를 가져 와서 정수를 반환하는 함수입니다.

fun updateDirty(dirty: Int, operation: (Int) -> Int): Int {
   return operation(dirty)
}

코드 본문은 두 번째 인수로 전달 된 함수를 호출하고 첫 번째 인수를 전달합니다.

 

2. 이 함수를 호출하려면 정수와 함수를 전달하십시오.

val waterFilter: (Int) -> Int = { dirty -> dirty / 2 }
println(updateDirty(30, waterFilter))
⇒ 15

전달하는 함수는 람다 일 필요는 없습니다. 대신 일반 명명 된 함수일 수 있습니다. 인수를 일반 함수로 지정하려면 :: 연산자를 사용하십시오. 이런 식으로 Kotlin은 함수 호출을 시도하지 않고 함수 참조를 인수로 전달하고 있음을 알고 있습니다.

 

3. updateDirty ()에 이름이 지정된 일반 함수를 전달하십시오.

fun increaseDirty( start: Int ) = start + 1

println(updateDirty(15, ::increaseDirty))
⇒ 16

 

참고 : Kotlin은 기능을 수행하는 모든 매개 변수가 마지막 매개 변수 인 것을 선호합니다.
고차 함수로 작업 할 때 Kotlin은 마지막 매개 변수 호출 구문이라는 특수 구문을 사용하므로 코드를
더욱 간결하게 만들 수 있습니다. 이 경우 함수 매개 변수에 람다를 전달할 수 있지만 
람다를 괄호 안에 넣을 필요는 없습니다.

 

var dirtyLevel = 19;
dirtyLevel = updateDirty(dirtyLevel) { dirtyLevel -> dirtyLevel + 23}
println(dirtyLevel)
⇒ 42

 

반응형
Comments