Kotlin 표준함수인 apply, let , run, with, also, takeIf의 정의와 사용예를 기술한다.
apply 함수는 객체에 method들을 호출 하고, 그 객체를 return 한다.
val menuFile = File("menu-file.txt").apply {
setReadable(true) // lambda 밖에서 menuFile.setReadable(true)와 동일하다.
setWritable(true)
}
labmda를 실행하고, 마지막줄의 실행 결과를 return 한다.
val firstElement = listOf(1,2,3).first()
val firstElementSquared = firstElement * firstElement
위와 같은 함수를 let을 통해 축약 할 수 있다.
: firstElement 변수까지 생략 하여 더 간결하게 작성 할 수 있다.
val firstElementSquared = listOf(1,2,3).first().let { it * it }
apply는 인자가 없고, let은 Object를 인자로 전달한다.
apply는 Object를 return 하고, let은 마지막 줄의 실행 결과를 return 한다.
var vipGuest:String? = null
vipGuest?.let { "VIP 고객님 안녕하세요" } ?: "고객님 안녕하세요"
vipGuest.let { "고객님 안녕하세요" } 하게 되면 "고객님 안녕하세요"가 return 된다.
run은 apply와 동일하지만, 수신된 객체를 반환하지 않고 결과를 반환 한다.
그리고 run은 함수를 인자로 받아 실행 할 수 있는데 이를 통해 함수 연쇄 호출을 가독성이 높게 작성 할 수 있다.
println(functionA(functionB(someString)))
someString
.run(::functionA)
.run(::functionB)
.run(::println)
val stastus = run {
true
}
val result = with(someString) {
// some statement
}
with는 run와 동일하지만, 첫번째 인자가 lambda가 아니라, object이다.
run과 문법만 좀 다른 것인데 같은 일을 하는 것이니 run을 사용하는 것을 추천한다.
also는 let과 동일하지만, 마지막 statement의 결과 대신 objet를 return 한다.
takeif는 labda function 에서는 boolean을 return 하고 boolean이 true일때는 object, false 일때는 null이 전달 된다.
if (obj.isTrue() {
// statement
}
take if를 사용하면 간결하게 표기 할 수 있다.
obj.takeif({ it.isTrue()})?.run(:println)
takeif와 유사한녀석으로 그와 달리 labmda 결과가 false일때 object가 return 된다.
obj.takeif({ it.isFalse() })?.run(:println)
fun a(obj: MyObject) {
if (a.isNotValid()) {
return
}
}
위와 같은 코드를 작성하는데 takeIf를 이용해서 lambda 같은 코드를 작성 할 수 있을까?
fun a(obj: MyObject) {
a.takeif { it.isNotValid() }?.run { return }
}
동일 하게 동작한다.