Dictionary 在函数中从Hashmap正确返回Int
我在Kotlin中有一个函数,它接受一个Dictionary 在函数中从Hashmap正确返回Int,dictionary,kotlin,return-value,Dictionary,Kotlin,Return Value,我在Kotlin中有一个函数,它接受一个Int参数并返回一个基于公式的值。为了加快速度,我将中间结果存储在HashMap 我不知道如何正确地写这个。我有 return calculatedResults[n]!! 但我不确定它是否有点黑 函数的返回类型是否应该是Int?,因为HashMap可能包含键n,而值可能是null?这是否意味着HashMap应该是?根本的问题是calculatedResults可能被包含(if(calculatedResults.containsKey(n)))和获取(
Int
参数并返回一个基于公式的值。为了加快速度,我将中间结果存储在HashMap
我不知道如何正确地写这个。我有
return calculatedResults[n]!!
但我不确定它是否有点黑
函数的返回类型是否应该是
Int?
,因为HashMap
可能包含键n
,而值可能是null
?这是否意味着HashMap
应该是
?根本的问题是calculatedResults
可能被包含(if(calculatedResults.containsKey(n))
)和获取(返回calculatedResults[n]
)之间的其他线程修改
因此,即使在使用containsKey检查后,calculatedResults[n]也可能返回错误的结果,包括null
,应避免这种检查方式
使用代码>通常只应在绝对必要时使用,因为它可能导致NPE。这绝对是骇客
请使用以下语法解决此问题:
calculatedResults[n]?.let {
return it
}
基本上这是一个很好的表达方式
val result = calculatedResults[n]
if(result != null) {
return result
}
看
更好的方法是使用内置的:
函数的返回类型是否应为Int?
,因为HashMap
可能包含键n,但值可能为null?这是否意味着HashMap
应该是
?
不,您在定义方法签名时做了正确的事情。编译器只是抱怨,因为方法中发生的事情不适合它。如果您更改了方法签名,您只需将问题移到函数调用<代码> Q2 < /代码>,而不必处理它。 < P>您应该考虑将此重写为更惯用的代码。如果地图中尚未设置值,则计算该值是一项相当基本的任务:
fun q2(n: Int): Int {
return calculatedResults.getOrPut(n) {
42 //q
}
}
将检查n
的值是否存在。如果该值存在,将返回该值。如果值不存在,lambda返回的值将被赋值,然后由getOrPut
返回
看看这个例子:
fun calculate(n: Int) = n * 5 // some calculation
private fun q2(n: Int) = calculatedResults.getOrPut(n) {
calculate(n)
}
函数的返回类型是否应为Int?因为当
HashMap可能包含键n值是否可以为null?那不是吗
意思是HashMap应该是
在这种情况下,问题的答案显然是“否”,因为如果缺少值,只需添加它即可。因此,q2
返回的值永远不能是null
private fun q2(n: Int): Int {
return calculatedResults.getOrPut(n) { calcQ() }
}
private fun calcQ(): Int {
val q = ...
return q
}
fun q2(n: Int): Int {
return calculatedResults.getOrPut(n) {
42 //q
}
}
fun calculate(n: Int) = n * 5 // some calculation
private fun q2(n: Int) = calculatedResults.getOrPut(n) {
calculate(n)
}