在 Kotlin 中,是否可以在“if”条件语句内声明变量?

7

我有这行代码:

if (x * y * z > maxProduct) maxProduct = x * y * z

我的问题是每次使用 x * y * z 时都需要重复两遍。我知道我可以在 if 语句之前创建一个变量,像这样:
val product = x * y * z
if (product > maxProduct) maxProduct = product

但我不喜欢必须创建一个仅用于此表达式的临时变量。有什么方法可以改进我的代码吗?


3
你也许可以使用 when(val) 来完成,但最终结果可能不会更好。我会建议你直接创建val - EpicPandaForce
4
另外,您可以使用(x * y * z).let { ... }(x * y * z).run { ... }(with(x * y * z) { ... })。对于您特定的代码片段,您可以直接使用maxProduct = max(maxProduct, x * y * z) - user28434'mstep
你可以用不同的方法来做,但这样做并不能提高性能或可读性... - deHaar
1
maxProduct = max(maxProduct, x* y *z) 是最简单的。 - sidgate
2个回答

8
maxProduct = maxProduct.coerceAtLeast(x * y * z)

或者

maxProduct = max(maxProduct, x * y * z)

更普遍地说(对于没有快捷函数的表达式),.let()可用于避免使用单独的变量。但是,当你将它挤压在一行上时,在我看来阅读起来不是很容易:
(x * y * z).let { if (it > maxProduct) maxProduct = it }

6

对于您的需求,目前没有什么较好的改进方案。但是,如果您想要一些功能性的代码,而不需要创建新变量,则可以使用类似以下示例的代码:

(x * y * z).takeIf { it > maxProduct }?.let { maxProduct = it }

它不够易读,因此我建议使用额外的变量。


5
看起来符合这个问题的要求,但阅读起来不太容易(对我而言);-) - deHaar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接