有一个数组:notes: Array<KeyValueNote>?
我在下面的代码中使用了Kotlin 1.0.5-2
。
if (notes != null) {
for (note in notes) {
// Put the note to the payload Json object only if the note is non-null.
payloadJson.put(note.key, note.value)
}
}
// Alternative 1.
notes?.let {
it.takeWhile { it != null /** Inspection will note The condition 'it != null' is always true' in here**/ }.forEach { payloadJson.put(it.key, it.value) }
}
// Alternative 2.
notes?.takeWhile { it != null /** Inspection will note The condition 'it != null' is always true' in here**/ }?.forEach { payloadJson.put(it.key, it.value) }
// Alternative 3.
notes?.filterNotNull()?.forEach { payloadJson.put(it.key, it.value) }
The condition 'it != null' is always true
,检查是否正确?因为我想确保{{}中只有非空项目1}}可以放到notes
。payloadJson
中看到安全通话,此处是否需要filterNotNull()?.
?,因为我查看了源代码, ?
的结果不能为空,但当我删除filterNotNull()
时,编译失败。答案 0 :(得分:2)
检查是对的。您将notes变量声明为可空项目的可空数组。
wreq
考虑到这一点,此数组需要 filterNotNull()?。,因为它可以为空。您可以在Kotlin documentation中找到有关Kotlin null安全性的更多信息。
答案 1 :(得分:1)
notes
的类型是Array<KeyValueNote>?
,这意味着数组的元素不能为空,但数组本身可以。因此,你的代码在&#34;我想要&#34;部分是正确的。一个较短的替代方案是:
notes?.forEach { payloadJson.put(it.key, it.value) }
关于您的替代方案:
备选方案1:绝不要像这样使用let
。这应该是一个安全的电话?.
(如备选方案2中所示),没有别的。当我在这些情况下看到let
时,我的心会流血:(
备选方案2:takeWhile
和filter
显然不是一回事。我想你想要filterNotNull
,就像在备选方案3
备选3:由于数组的元素不能为空(因为它们的类型),filterNotNull
等同于toList
,因为它只是复制内容
答案 2 :(得分:1)
我猜你对不同范围内使用的it
参数感到困惑。第一种选择可以改写为:
notes?.let { notesSafe:Array<KeyValueNote> -> // notesSafe is not null here
notesSafe
.takeWhile { item:KeyValueNote -> item != null } // item is already not null by it's type definition
.forEach { payloadJson.put(it.key, it.value) }
}
第二种选择几乎相同,编译器关于item:KeyValueNote
的注释也是正确的,原因相同:val items:Array<KeyValueNote>?
无法保存null
值 - 但items
本身可能是null
。
第三种方法可以安全地调用filterNotNull
,它会返回已删除null
值的源集合。但是,如上所述Array<KeyValueNote>
中不能包含null
值,因此不需要filterNotNull
。
总之,表达式可以写成:
notes?.forEach { payloadJson.put(it.key, it.value) }