问题描述
我有一个包含 (1,2,null,3...) 的数组,我想为每个循环创建一个以仅获取值。我在许多不同方面都需要这个,所以如果有人能告诉我一个简单的方法来管理它会很好。
我希望 1,3 ... 在一个数组中但没有空值。我是初学者,我在其他地方找不到我的问题的答案。
解决方法
Kotlin 非常强调使用函数来转换集合,而不是自己编写 for
循环。有 a lot of functions,但两个非常重要的是 map
和 filter
。
map
将 every 元素转换为其他元素 - 它将每个元素映射到另一个元素。
listOf(1,2,3).map { it * 2 }
>> [2,4,6]
filter
删除 与您传入的谓词不匹配的元素(一个为匹配返回 true 的函数) - 它保留那些匹配的元素,基本上(你是过滤掉那些没有的)
listOf(1,3).filter { it > 1 }
>> [2,3]
在这种情况下,您希望过滤掉数组中的 null
值。所以你可以这样做:
arrayOf(1,null,3).filter { it != null }
>> [1,3]
所以过滤器只允许通过非空的东西,对吧?
还有一个 filterNot
函数,它翻转谓词逻辑 - 它只允许通过不匹配的东西:
arrayOf(1,3).filterNot { it == null }
>> [1,3]
所以现在我们要检查每个项目是否为 null,并且只有在不为真时才保留它。您可以采用任何一种方式,以更易读的方式进行。
重点是处理空值的特殊情况 - filterNotNull
基本上删除任何空值:
arrayOf(1,3).filterNotNull()
>> [1,3]
还有一个 mapNotNull
函数,它是一个 map
,它也可以删除任何空值,这有时很方便。
所有这些函数的重要一点是它们通常返回一个 List
,所以如果你真的想要一个 Array
,你需要在最后调用 toTypedArray()
:
arrayOf(1,3).filterNotNull().toTypedArray()
但通常您在 Kotlin 中更多地使用列表,尤其是在处理集合时。
绝对值得通读以熟悉以下内容: Collections overview
左侧有几个部分,但这是您需要了解的内容(即使您不会记住所有内容!)