Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/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
如何在Kotlin中优化HashMap?_Kotlin - Fatal编程技术网

如何在Kotlin中优化HashMap?

如何在Kotlin中优化HashMap?,kotlin,Kotlin,大家好。 今天我写了下一段代码。 看起来很管用,但我想知道,这是做我想做的事情的正确方式吗。 我有一个HashMap,其中监听器作为键,布尔值作为值,确定:监听器是否已经收到最后一次更新。 我重置HashMap的方法对吗 private val listenersUpdateState: HashMap<WeakReference<IStatusesListener>, Boolean> = HashMap() private fun setAllListenersTo

大家好。 今天我写了下一段代码。 看起来很管用,但我想知道,这是做我想做的事情的正确方式吗。 我有一个HashMap,其中监听器作为键,布尔值作为值,确定:监听器是否已经收到最后一次更新。 我重置HashMap的方法对吗

private val listenersUpdateState: HashMap<WeakReference<IStatusesListener>, Boolean> = HashMap()

private fun setAllListenersToReadyToUpdate() {
    listenersUpdateState.keys.forEach { key -> 
        listenersUpdateState[key] = false
    }
}
private val listenersUpdateState:HashMap=HashMap()
private fun setAllListenersToReadyToUpdate()的{
listenersUpdateState.keys.forEach{key->
listenersUpdateState[键]=false
}
}

您可以使用一个方便的功能,如

示例:

private val listenersUpdateState:MutableMap=mutableMapOf()
私有fun setAllListenersToReadyToUpdate()=listenersUpdateState.mapValues{false}
这将有助于避免通过
map[key]
关键字一次又一次地索引map,从而提高性能

编辑:

上面的代码用于构造一个新映射,所有值都设置为false,但要重新绘制原始映射的所有值,请参见下面的代码

private fun setAllListenersToReadyToUpdate()=
listenersUpdateState.entries.onEach{it.setValue(false)}

如果您的目标是Java 8或更高版本,您可以使用
replaceAll

listenersUpdateState.replaceAll { _, _ -> false }
或者,您可以在映射上调用
clear()
,当您检索值时,如果值不存在,则默认为false:

fun isUpdated(someRef: WeakReference<IStatusesListener>) = listenersUpdateState[someRef] ?: false
fun已更新(someRef:WeakReference)=listenersUpdateState[someRef]?:false

谢谢。但是Map.mapValues()也会创建新的映射。
it.value
是一个
val
,不能更改。@Kiskae检查更新的答案,我在更新之前检查了它是否正常工作!一个可能使这一切变得更简单的想法是:使用
WeakReference
s的
MutableSet
,将它们在集合中的存在视为
true
,将它们的缺失视为
false
。要重置它,只需清除设置。