我有HashMap
列出所有MyType
元素
var allMyType = new HashMap[String, MyType]()
另一个HashMap
包含Array
个MyType
个元素
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,非常感谢。
答案 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而不包装选项。