Scala迭代元组映射

时间:2013-01-29 22:14:12

标签: list scala map iterator

我有一个键值对的映射,我正在尝试获取给定键的值,但是虽然它返回一个值,但是它带有一些,任何想法我怎么能摆脱它? 我的代码是:

val jsonmap = simple.split(",\"").toList.map(x => x.split("\":")).map(x => Tuple2(x(0), x(1))).toMap
val text = jsonmap.get("text")

“text”是键,我想要它映射到的值,我目前得到以下输出:

Some("4everevercom")    

我尝试使用flatMap而不是Map,但它不起作用

4 个答案:

答案 0 :(得分:5)

您正在寻找apply方法。 SeqSetMap实施了不同的apply方法,区别在于每个方法之间的主要区别。

作为一种语法糖,.apply中可以省略o.apply(x),所以你只需要这样做:

val text = jsonmap("text") // pass "key" to apply and receive "value"

对于Seqapply会获取一个索引并返回一个值,就像您在自己的示例中所使用的那样:

x(0), x(1)

对于Setapply取值,并返回Boolean

答案 1 :(得分:4)

您可以使用getOrElse,@Brian stated或“apply”方法并自行处理缺席值:

val text: String = jsonmap("text")
// would trow java.util.NoSuchElementException, if no key presented

此外,您可以设置一些默认值,这样如果找不到密钥,Map就可以回退到它:

val funkyMap = jsonmap.get("text").withDefaultValue("")
funkyMap("foo")
// if foo or any other key is not presented in map, "" will be returned

如果您想要所有缺失键的默认值,请使用它。

答案 2 :(得分:3)

如果您有一个或您指定的默认值,则可以使用getOrElse获取Some的值。如果密钥存在于地图中,您将从Some获取值。如果密钥不存在,您将获得指定的值。

scala> val map = Map(0 -> "foo")
map: scala.collection.immutable.Map[Int,String] = Map(0 -> foo)

scala> map.get(0)
res3: Option[String] = Some(foo)

scala> map.getOrElse(1, "bar")
res4: String = bar

另外,有关Scala的部分和无选项的信息,请参阅此处:http://www.codecommit.com/blog/scala/the-option-pattern

答案 3 :(得分:0)

只是提供其他选项,可以帮助您使用Option以及标准库中的其他类似结构。

您还可以对选项进行迭代(映射)。这是有效的,因为Option是一个Iterable,包含零个或一个元素。

myMap.get(key) map { value =>
  // use value...
}

等效地,如果您认为代码更清晰,则可以使用for

for (value <- myMap.get(key)) {
  // use value...
}