2017-04-08 174 views
0

我有值的列表选项元组的名单,可能是None斯卡拉:在地图

val list = List(("apples",1), ("oranges",3), ("avocado",4), None, ("pears",10))

我怎样才能将其转化成像地图:

Map("apples"->1, "oranges"->3, "avocado"->4, "pears"->10)

跳过空元素?

error: Cannot prove that Option[(String, Int)] <:< (T, U).

我在想是这样的:

,因为它给我的错误,我不能用toMaplist

val m = list.map(x => x match{case Some(x) => x._1->x._2 
case None => None}) 

但很明显,我失去了一些东西:(

+0

'filter'它。将它映射到一个元组。调用'toMap'? –

+0

将它映射到一个元组,它不是我所需要的。我无法调用toMap(我更新了问题以提供有关此问题的更多信息)。其实,过滤器看起来是个好主意。 :)我会尝试一下 – salvob

+0

你需要[''扁平''Option'](https://stackoverflow.com/questions/4730842/how-to-transform-scala-collection-of-optionx-对信息收集的-X)。 –

回答

2

试试这个:

list.collect{case (k,v) => (k,v)}.toMap 
1

,可以在列表上做.flatten只得到非无的元素,在做一个.toMap

list // : List[Option[(String,Int)]] 
    .flatten // : List[(String,Int)] 
    .toMap //: Map[String, Int] 
+0

'flatten' wouldn因为原始列表不是'List [Option [(String,Int)]]''。 –

+1

错误消息暗示它是:错误:无法证明Option [(String,Int)] <:<(T,U)。 –