【问题标题】:How to store values in a for each loop in kotlin simple如何在kotlin简单的for每个循环中存储值
【发布时间】:2021-04-08 16:42:42
【问题描述】:

我有一个包含 (1, 2, null, 3...) 的数组,我想为每个循环创建一个仅获取值的数组。我在很多不同的方面都需要这个,所以如果有人能告诉我一个简单的方法来管理它会很好。

我希望 1、2、3 ... 在一个数组中,但没有空值。我是初学者,在其他地方找不到我的问题的答案。

【问题讨论】:

    标签: arrays loops kotlin foreach


    【解决方案1】:

    Kotlin 非常强调使用函数来转换集合,而不是自己编写 for 循环。有a lot of functions,但有两个非常重要的是mapfilter

    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

    左边有几个部分,但这是您需要了解的内容(即使您不记得所有内容!)

    【讨论】:

    • 说得好!太多的问题归结为“我想用循环来做 X”,而真正的答案是“如果你想做 X,有更好的方法”。当列表在大多数情况下更好时,关于数组的问题也太多了。我不确定他们是来自那些只学习了足够多的 Kotlin 以至于他们可以用 Kotlin 语法编写 Java/C/Python/任何程序的人,还是来自只学过数组和循环…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-07
    • 2015-08-25
    • 2018-09-15
    • 2016-08-21
    • 1970-01-01
    • 1970-01-01
    • 2022-11-20
    相关资源
    最近更新 更多