1. closure
fun main() {
val calc = Calc()
var result = 0
calc.addNum(2,3) { x, y -> result = x + y }
println(result)
}
class Calc {
fun addNum(a: Int, b: Int, add: (Int, Int) -> Unit) {
add(a, b)
}
}
2. let()
- let()함수는 함수를 호출하는 객체 T를 이어지는 block의 인자로 넘기고 block의 결과값 R을 반환합니다.
public inline fun <T, R> T.let(block: (T) -> R): R { ... return block(this) }
val score: Int? = 32
...
fun checkScoreLet() {
score?.let { println("Score: $it") }
val str = score.let { it.toString() }
println(str)
}
3. also()
- also()는 함수를 호출하는 객체 T를 이어지는 block에 전달하고 객체 T 자체를 반환합니다.
public inline fun <T> T.also(block: (T) -> Unit): T { block(this); return this }
var m = 1
m = m.also { it + 3 }
println(m)
4. apply()
- apply()함수는 also()함수와 마찬가지로 호출하는 객체 T를 이어지는 block으로 전달하고 객체 자체인 this를 반환합니다.
public inline fun <T> T.apply(block: T.() -> Unit): T { block(); return this }
5. run()
- run()함수는 인자가 없는 익명 함수처럼 동작하는 형태로 단독 사용하거나 확장 함수 형태로 호출하는 형태 두 가지로 사용할 수 있습니다.
public inline fun <R> run(block: () -> R): R = return block()
public inline fun <T, R> T.run(block: T.() -> R): R = return block()
6. with()
- with()함수는 인자로 받는 객체를 이어지는 block의 receiver로 전달하며 결과값을 반환합니다.
- run()함수와 기능이 거의 동일한데, run의 경우 receiver가 없지만 with()에서는 receiver로 전달할 객체를 처리합니다.
public inline fun <T, R> with(receiver: T, block: T.() -> R): R = receiver.block()
7. use()
- 보통 특정 객체가 사용된 후 닫아야 하는 경우가 생기는데 이때 use()를 사용하면 객체를 사용한 후 close() 등을 자동적으로 호출해 닫아 줄 수 있습니다.
public inline fun <T : Closeable?, R> T.use(block: (T) -> R): R
8. take()
public inline fun <T> T.takeIf(predicate: (T) -> Boolean): T?
= if (predicate(this)) this else null
8.1 takeif
- takeIf()함수의 정의에서 볼 수 있듯이 predicate 는 T 객체를 매개변수로서 받아오고, true이면 this를 아니면 null을 반환합니다.
8.2 takeUnless
- takeUnless함수는 !predicate()가 사용되어 false일 때 반환됩니다.
9. random()
Reference