Scala - 添加元素:MyType to Array = option [MyType] expected

时间:2014-11-24 17:26:00

标签: scala

我有HashMap列出所有MyType元素

var allMyType = new HashMap[String, MyType]()

另一个HashMap包含ArrayMyType个元素

var secondHashMap = new HashMap[Any, Array[MyType]]()

如果我创建的secondHashMap元素只有一个MyType元素,我会这样做:

secondHashMap.put(i, Array(allMyType.get(key)))

但是,我有错误:

Type mismatch, expected : Array[Relation], actual : Array[Option[Relation]]

更改行

var secondHashMap = new HashMap[Any, Array[MyType]]()

var secondHashMap = new HashMap[Any, Array[Option[MyType]]]()

解决了我的问题,但是如果我想在现有MyType元素的Array中添加secondHashMap元素:

secondHashMap.put(563, secondHashMap.get(563)+=allMyType.get(key))

我收到了错误:

Type mismatch, expected : Array[Option[Relation]], actual : Option[Array[Option[Relation]]]

如何解决此类问题?

我希望很清楚:s,非常感谢。

2 个答案:

答案 0 :(得分:3)

get方法返回值类型的选项,因为查找可能会失败。签名:

  def get(key: A): Option[B]

你可以通过在选项上调用getOrElse(defaultValue)来解决这个问题,或者使用Map的apply方法来返回B而不是B的Option。但是你必须确保密钥存在,因为否则会有例外。

所以

secondHashMap.put(i, Array(allMyType.get(key)))

可能会成为:

 secondHashMap.put(i, Array(allMyType(key)))

答案 1 :(得分:0)

作为一种替代方法,可以防止你进入Option [Array [A]],Array [Option [A]]路径,你可以将你的初始输入反转为:

var allMyType = new HashMap[String, MyType]()
var secondHashMap = new HashMap[Any, Array[MyType]]()
allMyType.get(key).fold(MISSING KEY CASE)(x => secondHashMap.put(i, x)) 

在这种情况下折叠查看身份案例(NONE),其中在allMyType HashMap中找不到请求的密钥,然后运行您需要的任何逻辑。相反,如果它不是标识(SOME(x)),那么它允许你使用x而不包装选项。