有没有办法在 kotlin 中为多个可为空的变量链接多个 let?
fun example(first: String?, second: String?) { first?.let { second?.let { // Do something just if both are != null } } }
我的意思是,像这样:
fun example(first: String?, second: String?) { first?.let && second?.let { // Do something just if both are != null } }
如果对这里感兴趣,我有两个功能可以解决这个问题。
inline fun <T: Any> guardLet(vararg elements: T?, closure: () -> Nothing): List<T> { return if (elements.all { it != null }) { elements.filterNotNull() } else { closure() } } inline fun <T: Any> ifLet(vararg elements: T?, closure: (List<T>) -> Unit) { if (elements.all { it != null }) { closure(elements.filterNotNull()) } }
用法:
// Will print val (first, second, third) = guardLet("Hello", 3, Thing("Hello")) { return } println(first) println(second) println(third) // Will return val (first, second, third) = guardLet("Hello", null, Thing("Hello")) { return } println(first) println(second) println(third) // Will print ifLet("Hello", "A", 9) { (first, second, third) -> println(first) println(second) println(third) } // Won't print ifLet("Hello", 9, null) { (first, second, third) -> println(first) println(second) println(third) }