Scala 中的 LINQ 样式查询json4s
如下所示:
val jvalue = parse(text) // (1) val jobject = for(JObject(o) <- jvalue) yield o // (2)
我不明白(2)是如何工作的。你会如何去糖这个 -for
声明?
Scala 中的 LINQ 样式查询json4s
如下所示:
val jvalue = parse(text) // (1) val jobject = for(JObject(o) <- jvalue) yield o // (2)
我不明白(2)是如何工作的。你会如何去糖这个 -for
声明?
形式的理解
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)