我有一个IndexedSeq[Map[String, String]]
,我想在key为“text”的地方提取值,我想把它放在val text:IndexedSeq[String]
中。我写了下面这篇文章,但它不起作用:
val text:IndexedSeq[String] = _
for(j <- 0 to indSeq.length-1){
text(j) = indSeq(j).get("text")
}
答案 0 :(得分:1)
您可能会看到编译器错误,因为indSeq(j).get("text")
会返回Option[String]
,而不是String
。
如果您只想获取序列中键"text"
的所有值,请使用:
val text = indSeq flatMap (_ get "text")
如果两个序列的索引排成一行很重要,那么在密钥"text"
不存在的情况下,您将需要替换默认值:
val text = indSeq map (_.getOrElse("text", "default"))
答案 1 :(得分:0)
由于您最初尝试使用for-comprehension,您可能也有兴趣这样做:
val text = (for { m <- indSeq } yield m get "text") flatten
修改
或者如果你想要一个默认值,你可以这样做:
val text = for { m <- indSeq } yield m getOrElse("text", "default")
答案 2 :(得分:0)
我认为最好的方法是通过一个警卫来理解摆脱没有"text"
元素的地图:
val result = for {
i <- 0 until indexSeq.length
map = indexSeq(i)
if map isDefinedAt ("text")
} yield { (i, map("text")) }
val seq = result.toIndexedSeq
这样就可以将原始索引与地图保持一致。它还避免保留任何var
值,这始终是一个额外的