Scala 表达式中的多个字段
给定一个Scala 表达式中的多个字段,scala,map,Scala,Map,给定一个JsObject列表,我想将其转换为Map[String,JsValue],然后遍历每个Map的键值对,每对生成一个JsObject。最后,我想将所有这些JsObject放入一个列表[JsObject] 下面是我对for表达式的尝试 def getObjMap(obj: JsObject): Option[Map[String, JsValue]] = obj match { case JsObject(fields) => Some(fields.toMap) ca
JsObject
列表,我想将其转换为Map[String,JsValue]
,然后遍历每个Map的键值对,每对生成一个JsObject。最后,我想将所有这些JsObject放入一个列表[JsObject]
下面是我对for表达式的尝试
def getObjMap(obj: JsObject): Option[Map[String, JsValue]] = obj match {
case JsObject(fields) => Some(fields.toMap)
case _ => None
}
def createFields(x: (String, JsValue)): JsObject = Json.obj("n" -> x._1,
"v" -> x._2)
val objects: List[JsObject] = foo()
val res: List[JsObject] = for {
obj <- objects
map <- getObjMap(obj)
mapField <- map
} yield(createFields(mapField))
我认为问题的根源在于这样一个事实,即for construction从处理一个列表开始,然后最终处理一个选项(从
getObjMap
)。结构的类型需要在整个过程中保持不变,以便理解。对getObjMap
调用的结果调用.toList
,可以解决以下问题:
val res: List[JsObject] = for {
obj <- objects
map <- getObjMap(obj).toList
mapField <- map
} yield(createFields(mapField))
val res:List[JsObject]=for{
obj谢谢,我会试试。顺便说一句,我的代码看起来怎么样?是idomatic还是垃圾?我能做得更好吗?那很有效,谢谢,阴影地带。我没有包括它,但我有我的createFields(…)
函数包含第三个字段(l
(行号))其中,对于对象中的每个obj,我需要增加一个行号。目前,我在getObjMap(…
)方法的开头增加了行号。如何在for表达式中仍然使用增加的行号?
val res: List[JsObject] = for {
obj <- objects
map <- getObjMap(obj).toList
mapField <- map
} yield(createFields(mapField))