kotlin——我可以重写这个映射访问以摆脱 ``!!`` 吗?
kotlin -- can I rewrite this map access to get rid of the ``!!``?
假设我有一个
enum class ConceptualPosition{
A1,A2,A3,A4,A5,A6,A7,A8,
B1,B2,B3,B4,B5,B6,B7,B8,
C1,C2,C3,C4,C5,C6,C7,C8
}
现在我想构建一个图,其中每个位置都有一个节点。
import [...].domain.model.base.ConceptualPosition
import [...].domain.model.base.ConceptualPosition.*
import [...].domain.model.base.Node
import [...].domain.model.base.Node.MovableDirection.*
class MyGraph:Graph{
private val internalPositions = mutableMapOf<ConceptualPosition, Node>()
override val position by lazy {internalPositions.toMap().withDefault {
throw IllegalArgumentException("position '$it' does not exist")
}}
init{
//create nodes for all positions
ConceptualPosition.values().forEach { internalPositions[it] = Node(it) }
//now build graph
position[A1]!!.connectBothWaysWith(position[A2]!!,RIGHT)
position[A2]!!.connectBothWaysWith(position[A3]!!,RIGHT)
[...]
}
}
因为我有一个 withDefault
会立即抛出异常,并且由于 Kotlin 正确地将 position
的类型推断为 Map<ConceptualPosition,Node>
,我想我可以相当确定如果查找没有失败,我从中得到了一个非空值。
Kotlin 显然无法安全地推断出这一点。
我可以重构它(以合理的方式)以摆脱 !!
吗?
使用Map.getValue
代替get
:
position.getValue(A1).connectBothWaysWith(position.getValue(A2),RIGHT)
或者,您可以使用更精确的 return 类型(Kotlin 标准库 makes the equivalent private)定义您自己的 withDefault
版本:
class MapWithDefault<K, V>(val map: Map<K, V>, val default: (K) -> V) : Map<K, V> by map {
override fun get(key: K): V = map[key] ?: default(key)
}
fun <K, V> Map<K, V>.withDefault(default: (K) -> V) = MapWithDefault(this, default)
假设我有一个
enum class ConceptualPosition{
A1,A2,A3,A4,A5,A6,A7,A8,
B1,B2,B3,B4,B5,B6,B7,B8,
C1,C2,C3,C4,C5,C6,C7,C8
}
现在我想构建一个图,其中每个位置都有一个节点。
import [...].domain.model.base.ConceptualPosition
import [...].domain.model.base.ConceptualPosition.*
import [...].domain.model.base.Node
import [...].domain.model.base.Node.MovableDirection.*
class MyGraph:Graph{
private val internalPositions = mutableMapOf<ConceptualPosition, Node>()
override val position by lazy {internalPositions.toMap().withDefault {
throw IllegalArgumentException("position '$it' does not exist")
}}
init{
//create nodes for all positions
ConceptualPosition.values().forEach { internalPositions[it] = Node(it) }
//now build graph
position[A1]!!.connectBothWaysWith(position[A2]!!,RIGHT)
position[A2]!!.connectBothWaysWith(position[A3]!!,RIGHT)
[...]
}
}
因为我有一个 withDefault
会立即抛出异常,并且由于 Kotlin 正确地将 position
的类型推断为 Map<ConceptualPosition,Node>
,我想我可以相当确定如果查找没有失败,我从中得到了一个非空值。
Kotlin 显然无法安全地推断出这一点。
我可以重构它(以合理的方式)以摆脱 !!
吗?
使用Map.getValue
代替get
:
position.getValue(A1).connectBothWaysWith(position.getValue(A2),RIGHT)
或者,您可以使用更精确的 return 类型(Kotlin 标准库 makes the equivalent private)定义您自己的 withDefault
版本:
class MapWithDefault<K, V>(val map: Map<K, V>, val default: (K) -> V) : Map<K, V> by map {
override fun get(key: K): V = map[key] ?: default(key)
}
fun <K, V> Map<K, V>.withDefault(default: (K) -> V) = MapWithDefault(this, default)