if (person != null && person.isAdult) {
view.showPerson(person)
} else {
view.showError()
}
person
?.takeIf { it.isAdult }
?.let(view::showPerson)
?: view.showError()
코틀린에서 자주 사용되는 관용구 takeIf,let,엘비스 연산자는 코틀린 개발자는 익숙하지만, 숙련된 개발자만을 위한 코드는 좋은 코드가 아니다
takeIf
public inline fun <T> T.takeIf(predicate: (T) -> Boolean): T? = if (predicate(this)) this else null
let
inline fun <T, R> T.let(block: (T) -> R): R { return block(this) }
첫번째 예제는 두번째 예제보다 수정이 용이하다
let의 리턴값이 null이면 showError가 호출된다. 첫번째 예제와 다르게 동작할 수 있음
print(students.filter{}.joinToString{}) -> students.filter{}.joinToString{}.let(::print)
var obj = FileInputStream("/file.gz") .let(::BufferedInputStream) .let(::ZipInputStream) .let(::ObjectInputStream) .readObject() as SomeObject