Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dictionary 在函数中从Hashmap正确返回Int_Dictionary_Kotlin_Return Value - Fatal编程技术网

Dictionary 在函数中从Hashmap正确返回Int

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)))和获取(

我在Kotlin中有一个函数,它接受一个
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)
}