fun printPerson(person: Person?) {
if (person != null) {
println(person.name)
println(person.age)
}
}
fun printPerson(person: Person?) {
person?.let {
println(it.name)
println(it.age)
}
}
public inline fun <T, R> T.let(block: (T) -> R): R {
return block(this)
}
let : 람다의 결과를 반환한다. 람다 내에서 it을 사용한다.
run : 람다의 결과를 반환한다. 람다 내에서 this를 사용한다.
also : 객체 그 자체를 반환한다. 람다 내에서 it을 사용한다.
apply : 객체 그 자체를 반환한다. 람다 내에서 this를 사용한다.
with(파라미터, 람다) : 유일하게 확장함수가 아니다. this를 사용해 접근하고, this는 생략 가능하다.
this : 생략이 가능한 대신, 다른 이름을 붙일 수 없다. (확장함수를 파라미터로 받음)
it : 생략이 불가능한 대신, 다른 이름을 붙일 수 있다. (일반함수를 파라미터로 받음)
public inline fun <T, R> T.let(block: (T) -> R): R {
return block(this)
}
public inline fun <T, R> T.run(block: T.() -> R): R {
return block()
}
val value1 = person.let {
it.age
}
val value2 = person.run {
this.age
}
val value3 = person.also {
it.age
}
val value4 = person.apply {
this.age
}
with(person) {
println(name)
println(this.age)
}
val strings = listOf("APPLE", "CAR")
strings.map { it.length }
.filter {it > 3}
.let(::println)
val length = str?.let {
println(it.uppercase())
it.length
}
val numbers = listOf("one", "two", "three", "four")
val modifiedFirstItem = numbers.first()
.let { firstItem ->
if (firstItem.length >= 5) firstItem else "!$firstItem!"
}.uppercase()
println(modifiedFirstItem)
val person = Person("person", 100).run(personRepository::save)
val person = Person("person", 100).run {
hobby = "독서"
personRepository.save(this)
}
fun createPerson (
name: String,
age: Int,
hobby: String,
): Person {
return Person(
name = name,
age = age
).apply {
this.hobby = hobby
}
}
mutableListOf("one", "two", "three")
.also { println("four 추가 이전 지금 값 : $it") }
.add("four")
return with(person) {
PersonDto(
name = name,
age = age,
)
}
// 1번 코드
if (person! = null && person.isAdult) {
view.showPerson(person)
} else {
view.showError()
}
// 2번 코드
person?.taskIf { it.isAdult }
?.let(view::showPerson)
?: view.showError()
참고