gpt4 book ai didi

java - 在包含 NULL 的 ArrayList 上使用 map {} 时出现 NPE

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:05:17 28 4
gpt4 key购买 nike

我得到了

java.lang.NullPointerException: Attempt to invoke virtual method 'float java.lang.Number.floatValue()' on a null object reference

关于以下代码:

val localHistory: ArrayList<Float> = ArrayList<Float>()
...
val strHistory = localHistory.map { value -> decoration.decoratedValue(ref.format, value) }

我刚刚了解到 ArrayList 可能包含空值 (ooookay)。这意味着映射转换闭包中的 value 可能为 NULL,不是吗?

但这不可能,因为 value 不是可选类型,并且编译器说 if (value != null) 将始终为真。

那么问题来了,这种情况下如何避免NPE呢?

最佳答案

我建议将您从 Java 收到的 Collection 中的每个参数标记为可为空(除非您当然知道它永远不会null:

val floats: List<Float?> = someJavaClass.getFloats()

然后您可以过滤掉 null 并执行您的 map 操作:

val newFloats: List<Float> = floats
.filter { it != null }
.map { it + 1 }

请记住,每个 filtermap(等等)操作都会迭代整个集合并每次都创建一个新集合。您最好使用延迟迭代的 Sequence

如评论中所述,可以使用 filterNotNull 直接过滤掉所有空值:

val newFloats: List<Float> = floats
.filterNotNull()
.map { it + 1 }

mapNotNull 只保留 map 函数不返回 null 的值,这也消除了 filterNotNull:

val newFloats: List<Float> = floats
.mapNotNull { it?.plus(1) }

我能想到的另一种结构适用于您的示例,但它非常难读且非常复杂。但这里是:

val strHistory = localHistory
.mapNotNull { decoration.decoratedValue(ref.format, it ?: return@mapNotNull null) }

关于java - 在包含 NULL 的 ArrayList 上使用 map {} 时出现 NPE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55158113/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com