5. let
val name = person.let { it.name }
inline fun <T, R> T.let(block: (T) -> R)
: R = block(this)
6. let
val name = person.let { it.name }
println(name) // myeongin
inline fun <T, R> T.let(block: (T) -> R)
: R = block(this)
7. let
val person: Person? = Person()
inline fun <T, R> T.let(block: (T) -> R)
: R = block(this)
8. let
val person: Person? = Person()
val name = person?.let { it.name }
inline fun <T, R> T.let(block: (T) -> R)
: R = block(this)
9. let
val person: Person? = Person()
val name = person?.let { it.name }
println(name) // myeongin
inline fun <T, R> T.let(block: (T) -> R)
: R = block(this)
11. let
val person: Person? = null
val name = person.let { it.name } // Error
inline fun <T, R> T.let(block: (T) -> R)
: R = block(this)
12. let
val person: Person? = null
val name = person?.let { it.name }
inline fun <T, R> T.let(block: (T) -> R)
: R = block(this)
13. let
val person: Person? = null
val name = person?.let { it.name }
println(name) // null
inline fun <T, R> T.let(block: (T) -> R)
: R = block(this)
14. let
val person: Person? = null
val name = person?.let { it.name } ?: "Lezhin"
inline fun <T, R> T.let(block: (T) -> R)
: R = block(this)
15. let
val person: Person? = null
val name = person?.let { it.name } ?: "Lezhin"
println(name) // Lezhin
inline fun <T, R> T.let(block: (T) -> R)
: R = block(this)
16. let
fun sendEmail(email: String) {
TODO()
}
var email: String? = null
email?.let { sendEmail(it) }
inline fun <T, R> T.let(block: (T) -> R)
: R = block(this)
17. let
• type T(자신)을 block으로 감쌉니다.
• block 안에서 자기자신에게 접근 할때는 it을 사용합니다.
• 표현식으로 사용한다면 반환 값 R은 괄호 제일 마지막 라인의 값이 됩니다.
• ?.을 사용해 null check를 할 수 있습니다.
• null일 경우에 ?. 을 사용하면 null 을 반환합니다.
inline fun <T, R> T.let(block: (T) -> R)
: R = block(this)
18. with
inline fun <T, R> with(receiver: T, block: T.() -> R)
: R = receiver.block()
19. with
inline fun <T, R> with(receiver: T, block: T.() -> R)
: R = receiver.block()
with(person) {
name = "ari"
}
20. with
inline fun <T, R> with(receiver: T, block: T.() -> R)
: R = receiver.block()
with(person) {
name = "ari"
}
println(person) // Person(name=ari, age=18)
21. with
inline fun <T, R> with(receiver: T, block: T.() -> R)
: R = receiver.block()
recyclerView.apply {
layoutManager = LinearLayoutManager(context, LinearLayoutManager
adapter = this@Activity.adapter
addItemDecoration(Adapter.ContentDecoration(context))
}
22. with
inline fun <T, R> with(receiver: T, block: T.() -> R)
: R = receiver.block()
val ari = with(person) {
name = "ari"
}
println(ari) // Unit
23. with
inline fun <T, R> with(receiver: T, block: T.() -> R)
: R = receiver.block()
• T를 with의 인자로 전달합니다.
• block 안에서는 마치 object 내부 처럼 property를 자유롭게 접근합니다.
• 표현식으로 사용한다면 반환 값 R은 괄호 제일 마지막 라인의 값이 됩니다.
• 특정 instance의 내부 값들을 수정 하거나 조합할때 사용하면 좋습니다.
25. apply
inline fun <T> T.apply(f: T.() -> Unit)
: T { f(); return this }
val person = Person().apply {
name = "ari"
age = 24
}
26. apply
inline fun <T> T.apply(f: T.() -> Unit)
: T { f(); return this }
val person = Person().apply {
name = "ari"
age = 24
}
println(person) //Person(name=ari, age=24)
27. apply
inline fun <T> T.apply(f: T.() -> Unit)
: T { f(); return this }
AlertDialog.Builder(this).apply {
setTitle(getString(R.string.title))
setMessage(getString(R.string.message))
setPositiveButton(getString(R.string.ok),
{ dlg, _ -> dlg.dismiss() })
create()
show()
}
28. apply
inline fun <T> T.apply(f: T.() -> Unit)
: T { f(); return this }
• type.apply { .. } 을 사용합니다.
• type T를 입력받아 { .. } 안을 수행하고 자기 자신을 반환합니다.
• 생성과 동시에 추가적인 작업을 해줘야 할 때 유용합니다.
29. run
inline fun <R> run(block: () -> R): R = block()
inline fun <T, R> T.run(block: T.() -> R)
: R = block()
30. run
val name = person.run { name }
inline fun <R> run(block: () -> R): R = block()
inline fun <T, R> T.run(block: T.() -> R)
: R = block()
31. run
val name = person.run { name }
println(name) // myeongin
inline fun <R> run(block: () -> R): R = block()
inline fun <T, R> T.run(block: T.() -> R)
: R = block()
33. run
• let과 거의 유사합니다. 하지만 let은 T를 인자로 받지만 (T) run은 T.() T의 자신을 블럭 으로 지
정합니다.(this)
• 별도로 함수를 만들지 않고 block 을 통해 함수 구문을 만들고 실행 할수 있습니다.
• 역시나 마지막줄의 값을 반환합니다.
inline fun <R> run(block: () -> R): R = block()
inline fun <T, R> T.run(block: T.() -> R)
: R = block()
34. also
inline fun <T> T.also(block: (T) -> Unit)
: T { block(this); return this }
35. also
inline fun <T> T.also(block: (T) -> Unit)
: T { block(this); return this }
person.also {
it.name = "ari"
}
println(person) //Person(name=ari, age=18)
36. also
inline fun <T> T.also(block: (T) -> Unit)
: T { block(this); return this }
• let과 거의 유사합니다. let은 R을 반환 하는 반면 also는 자기자신 T를 반환합니다.
• 마지막줄의 값과 상관없이 자기 자신을 반환합니다.