我有这行代码:
if (x * y * z > maxProduct) maxProduct = x * y * z
但是我的问题是,当我想像这样使用它时,我必须写两次x * y * z
。我知道我可以在if
语句之前创建一个变量,如下所示:
val product = x * y * z
if (product > maxProduct) maxProduct = product
但是我不喜欢这样,我必须创建一个仅用于此表达式的临时变量。有没有办法改善我的代码?
您的要求没有很好的改善。但是,如果您想要一些功能性样式代码而不创建新变量,请使用以下代码:
(x * y * z).takeIf { it > maxProduct }?.let { maxProduct = it }
可读性较差,所以我建议使用其他变量。
您可以稍微改变比较逻辑,并且应该使用kotlin语法实现所需的行为:
when(val product = x*y*z.compareTo(maxProduct)){
1 -> maxProduct = product
}
根据有关compareTo()
功能的文档:
将此值与订单的指定值进行比较。如果此值等于指定的其他值,则返回零;如果小于其他值,则返回负数;如果大于其他值,则返回正数。
maxProduct = maxProduct.coerceAtLeast(x * y * z)
或
maxProduct = max(maxProduct, x * y * z)
[通常(对于没有快捷功能的表达式),.let()
可用于避免使用单独的变量。但是,当您将其压缩到一行时,我认为它不那么容易阅读:
(x * y * z).let { if (it > maxProduct) maxProduct = it }