我有以下代码
object DispatchLibrary
{
private var nodes = Map.empty[java.util.UUID, List[BigInt]]
def addNode(uuid: java.util.UUID) = if(nodes contains uuid) nodes else (nodes += (uuid -> Nil))
def addValue(uuid: java.util.UUID, value: BigInt) = nodes + (uuid -> (value :: (nodes get uuid getOrElse Nil)))
//def getValue(uuid: java.util.UUID) : List[BigInt] = ???
//def getValues() : List[BigInt] = ???
def calculated(): Boolean = !nodes.exists(_._1 eq null)
def main(args: Array[String]) : Unit =
{
val uuid = java.util.UUID.randomUUID()
addNode(uuid)
addValue(uuid, BigInt(999))
addValue(uuid, BigInt(9999))
nodes foreach {case (key, value) => println (key + "->" + value)}
}
}
在IntelliJ IDEA中运行上述代码会产生类似于以下输出的内容
8b2b4a7b-3e65-4de0-9035-8ee1d2910983->List()
我不确定为什么没有打印List。
从REPL运行类似的代码可以得到预期的输出
scala> var nodes = Map.empty[Int, List[BigInt]]
nodes: scala.collection.immutable.Map[Int,List[BigInt]] = Map()
scala> nodes += (1->Nil)
scala> nodes += (1 -> (BigInt(999) :: (nodes get 1 getOrElse Nil)))
scala> nodes += (1 -> (BigInt(9999) :: (nodes get 1 getOrElse Nil)))
scala> nodes foreach {case (key, value) => println (key + "-->" + value )}
1-->List(9999, 999)
如果你能帮我写评论方法,我将不胜感激。
答案 0 :(得分:4)
在addValue
方法中,您编写的nodes + (uuid -> (value :: (nodes get uuid getOrElse Nil)))
不会更改nodes
中的列表,只会创建一个添加了值的新副本。由于默认情况下Map
是不可变的,因此您必须像使用=
一样使用addNode
方法进行存储。
它打印任何内容的原因是因为第一个条目包含UUID(String)和Nil(空List)。 “8b2b4a7b-3e65-4de0-9035-8ee1d2910983”之所以有意义,是因为它是UUID。 “List()”是打印Nil的结果(因为它是一个空列表)。
你有它。请尝试在node += ...
中代替addValue
。