Kotlin:非NULL可能に変換変数条件が真の場合

アンディRES:

私は何を意味することは以下の通りです。

このコードを考えてみましょう:

// Can be a Long or null
val data1= param1.toLongOrNull()
val data2= param2.toLongOrNull()
val dataN= paramN.toLongOrNull()

// Proceed with the action if ALL of the data are not nulls
if(notNull(data1, data2, dataN)){
    // do something with data1,2,N
}

notNull()変数の引数のリストを受け入れユーティリティ関数です。すべての引数がヌルでない場合、trueを返します。

fun <T> notNull(vararg elements: T): Boolean {
    elements.forEach {
        if (it == null) {
            return false
        }
    }
    return true
}

私が午前問題は、Kotlinは内部のことを知らないということであるif、ブロックdata1,2を、Nはnullにすることはできません。その結果、これはコンパイルに失敗します。

if(notNull(data1, data2, dataN)){
     data1 + data2 + dataN
     // Fail: Required Long, Found Long?
     // Operator + not allowed on nullable receiver.
}

変数が明示的にnullに照らしてチェックされている一方、その後、Kotlinが、これは罰金であることを知っていると文句はありません。

if(data1!=null && data2!=null && dataN!=null){
     data1 + data2 + dataN
}

これは、「設定」にいいだろうnotNullKotlinはそれがtrueを返した後、渡されたパラメータのいずれかが、ブロック内でnullにすることはできませんことを知っているように、そのような方法で、方法。
これは可能ですか?

キーンマーク:

もちろん、複数の方法は、猫の皮膚に、しかし、あなたはこのような何かを行うことができます:

inline fun <T> doIfNotNull(elements: Array<T?>, block : (Array<T>) -> Unit) {
    val validElements = arrayListOf<T>()
    for (i in elements) {
       if (i == null) return
       validElements.add(i)
    }
    block.invoke(validElements.toArray(elements))
}

可変引数を使用すると、(素敵なように感じていない受信機の機能最初の引数を、作り、最後のパラメータである必要があります)。

inline fun <T> doIfNotNull(block : (Array<T>) -> Unit, vararg elements : T?) {
    val validElements = arrayListOf<T>()
    for (i in elements) {
       if (i == null) return
       validElements.add(i)
    }
    block.invoke(validElements.toArray(elements))
}

例:

fun test() {
    val elements = arrayOf(1L, 2L, null)
    doIfNotNull(elements, {
        it.sum()
    })
}

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=211603&siteId=1