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