アンディ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
}
これは、「設定」にいいだろうnotNull
Kotlinはそれが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()
})
}