首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Kotlin中的多变量字母

Kotlin中的多变量字母
EN

Stack Overflow用户
提问于 2016-02-20 03:42:24
回答 13查看 49.4K关注 0票数 164

有没有办法在kotlin中为多个可为空的变量链接多个let?

代码语言:javascript
复制
fun example(first: String?, second: String?) {
    first?.let {
        second?.let {
            // Do something just if both are != null
        }
    }
}

我的意思是,就像这样:

代码语言:javascript
复制
fun example(first: String?, second: String?) {
    first?.let && second?.let { 
        // Do something just if both are != null
    }
}
EN

回答 13

Stack Overflow用户

回答已采纳

发布于 2019-04-18 05:17:33

如果感兴趣,这里有两个我用来解决这个问题的函数。

代码语言:javascript
复制
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())
    }
}

用法:

代码语言:javascript
复制
// 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)
}
票数 86
EN

Stack Overflow用户

发布于 2016-02-20 04:29:05

您可以为此编写自己的函数:

代码语言:javascript
复制
 fun <T, U, R> Pair<T?, U?>.biLet(body: (T, U) -> R): R? {
     val first = first
     val second = second
     if (first != null && second != null) {
         return body(first, second)
     }
     return null
 }

 (first to second).biLet { first, second -> 
      // body
 }
票数 14
EN

Stack Overflow用户

发布于 2021-01-03 00:46:17

我喜欢使用列表过滤null值的想法,当我使用相同的类型时,我通常会做一些类似的事情,但是当有多个类型时,为了避免将值解析为Any,我只需要这样做

代码语言:javascript
复制
fun someFunction() {
    val value1: String = this.value1 ?: return
    val value2: Int = this.value2 ?: return
    ...
 }

它是有效的,对我来说保持类型安全是很重要的

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35513636

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档