let / with / run / apply

koreanhole·2022년 2월 14일
0

let

  • 하나 이상의 함수 call chain에서 사용된다.
val numbers = mutableListOf("one", "two", "three", "four", "five")
val resultList = numbers.map { it.length }.filter { it > 3 }
println(resultList) 

위와 같은 코드를 let을 사용해 다음과 같이 나타낼 수 있다.

val numbers = mutableListOf("one", "two", "three", "four", "five")
numbers.map { it.length }.filter { it > 3 }.let { 
    println(it)
    // and more function calls if needed
} 
  • 코드의 가독성을 높히기 위해 제한된 스코프 내에서 지역변수를 사용하기 위한 용도로 사용한다.

  • 기본적으로 해당 스코프 내의 lambda argument는 it으로 정의되지만 원한다면 다른 이름으로 사용할 수 있다.

val numbers = listOf("one", "two", "three", "four")
val modifiedFirstItem = numbers.first().let { firstItem ->
    println("The first item of the list is '$firstItem'")
    if (firstItem.length >= 5) firstItem else "!" + firstItem + "!"
}.uppercase()
println("First item after modifications: '$modifiedFirstItem'")

위에서는 firstItem으로 lambda argument를 따로 정의함

with

  • 해당 문맥의 객체(context obejct)가 전달된다. lambda result가 반환된다.

  • '해당 객체와 함께(with) 다음과 같이 수행하세요' 와 같이 코드를 읽으면 된다.(with can be read as “ with this object, do the following.”)

val numbers = mutableListOf("one", "two", "three")
with(numbers) {
    println("'with' is called with argument $this")
    println("It contains $size elements")
}

run

  • with와 동일한 기능을 수행한다.

  • an extension function of the context object

val service = MultiportService("https://example.kotlinlang.org", 80)

val result = service.run {
    port = 8080
    query(prepareRequest() + " to port $port")
}

// the same code written with let() function:
val letResult = service.let {
    it.port = 8080
    it.query(it.prepareRequest() + " to port ${it.port}")
}

it을 사용하지 않고 해당 객체의 문맥을 이어서 사용한다.

apply

  • 주로 객체 초기화 과정에서 사용한다.

  • apply는 값을 반환하지 않고, 대상 객체의 멤버 변수를 대상으로 사용해야 한다.

val adam = Person("Adam").apply {
    age = 32
    city = "London"        
}
println(adam)

참고

0개의 댓글