sumByDouble 需要 Double 找到 Double?

sumByDouble required Double found Double?

我有以下代码:

materialList.sumByDouble { elem -> elem.let { it.getPrice()?.toDouble() * it.getQuantity()?.toDouble() }}

Type mismatch. Required: Double, Found: Double?

为什么会出现这种错误?我已经用 elem.let 语句删除了可选的,不是吗?

尝试以下操作:

materialList.sumByDouble { elem -> elem.let { it.getPrice()?.toDouble() ?: 0.0 * it.getQuantity()?.toDouble() ?: 0.0 }

上面的代码所做的是,如果其中任何一个被评估为空,则分配一个默认值 0.0(确切地说,它将 0.0 分配给评估为空的值)

这是因为你的 it.getPrice()? 可能为空,你的 it.getQuantity()? 也是如此,所以它的作用与这个基本相同(完全是伪代码)

if(it.getQuantity() == null){
 use 0.0 to perform this calculation
} else {
 use it.getQuantity()
 }

Type mismatch. Required: Double, Found: Double? 的意思是,该方法需要一个非空双精度值,而您提供的可能是空值


旁注:

I've already removed the optional with the elem.let statement, no?

这样做:

{ elem -> elem.let { stillPotentiallyNull ->

只是一种确保您获得线程无法更改的 elem 实例的方法,但是,如果您这样做:

{ elem -> elem?.let { definitelyNotNull ->

然后你得到一个elem的实例,它既是线程安全的又不能为null,但这并不意味着elem里面的对象也不为null


正如@AjahnCharles 所指出的,这个答案只是为了解释您遇到此问题的原因以及可能如何使用默认值解决它,但是,您应该考虑如何将列表过滤为非空对象也是另一种解决方案。

一种可能的解决方案,尽管很危险,但使用以下方法:

it.getPrice()!!.toDouble() * it.getQuantity()!!.toDouble()

这表示您 100% 确定这些值不为空,如果它们为空,则会抛出空指针异常。

您可能会发现有用的额外文档:https://kotlinlang.org/docs/reference/null-safety.html

如果您确信 it.getPrice() 和 it.getQuantity() 不会 return 空值,那么您可以使用下面的代码:-非空运算符(!!) materialList.sumByDouble { elem -> elem.let { it.getPrice()!!.toDouble() * it.getQuantity()!!.toDouble() }}