2016-04-20 34 views
0

Scala从Option emelents列表创建地图?如何从可选项目列表创建scala地图?

myMap = (0 to r.numRows - 1).map { i => 
    if (Option(r.getValue(i,"Name")).isDefined) 
    (r.getValue(i, "Name")) -> (r.getValue(i, "isAvailable").toString) 
}.toMap 
foo(myMap) //here At this point, I'm geting the exception 

我在上面的代码尝试,但不能编译:

Exception: 
Error:(158, 23) Cannot prove that Any <:< (T, U). 
       }.toMap 
       ^
+0

的[转集合到一个地图,通过密钥的斯卡拉最好的方法是什么?]可能的复制(HTTP:/ /stackoverflow.com/questions/674639/scala-best-way-of-turning-a-collection-into-a-map-by-key) – suish

+0

为什么你不使用我,而我迭代?编辑了 – Nyavro

+0

。 @suish没有什么不同 – user1079341

回答

1

也许试试这个代码:

val myMap = (0 until r.numRows) flatMap { i => 
    for { 
    name <- Option(r.getValue(i, "Name")) 
    available = r.getValue(i, "isAvailable").toString 
    } yield (name, available) 
}.toMap 
foo(myMap) 

您的问题,最有可能是你使用if没有elseif是一个表达式在scala中,这意味着它评估的东西。

if (2 > 3) true 

相当于

if (2 > 3) true else() 

这样的类型是UnitBoolean这是Any共同父,这是你的错误。

请注意,您可以用until替换to-1,它可以做同样的事情但更具可读性。

您不应该真的检查OptionisDefined并对结果执行操作,如果这是真的,请使用map操作执行此操作。

为了解释我的实现一点:for部分将评估为Option[(String, String)],并且将包含您的元组,如果"Name"密钥存在,其他None。从概念上讲,flatMap将首先将您的指数范围更改为Option[(String, String)]的序列,然后对其进行平整处理,即移除所有None和展开所有Some s。

如果你想检查"isAvailable"为空,以及,你可以做类似的事情

for { 
    name  <- Option(r.getValue(i, "Name")) 
    available <- Option(r.getValue(i, "isAvailable")) 
} yield (name, available.toString) 
相关问题