使用json4s
的Scala中的LINQ样式查询如下所示:
val jvalue = parse(text) // (1) val jobject = for(JObject(o) <- jvalue) yield o // (2)
我不明白(2)究竟是如何工作的。你会如何解除这个for
声明?
答案 0 :(得分:2)
表格的理解
for(v <- generator) yield expr
被翻译成
generator.map(v => expr)
如果左侧有模式匹配,则过滤掉与模式不匹配的任何输入值。这意味着创建了包含匹配的部分函数,并且可以使用isDefinedAt
测试每个输入参数,例如
val f: PartialFunction[JValue, JObject] = { case o@JObject(_) => o }
f.isDefinedAt(JObject(List[JField]())) //true
f.isDefinedAt(JNull) //false
这意味着您的示例将被翻译为:
PartialFunction[JValue, List[JField]] mfun = { case JObject(o) -> o }
var jobject = jvalue.filter(mfun.isDefinedAt(_)).map(mfun)