2014-03-26 26 views
0

LINQ风格查询斯卡拉与json4s如下所示:如何“脱糖”这个Scala语句?

 
val jvalue = parse(text) // (1) 
val jobject = for(JObject(o) <- jvalue) yield o // (2) 

我完全不知道如何(2)工作。你将如何脱糖for-陈述?

+1

要知道,在JValue过滤器横切整个JSON树。所以你不仅仅匹配'jvalue',而且还要匹配下面的所有节点。换句话说,它在JSON树上进行搜索。 –

回答

2

换推导形式的

for(v <- generator) yield expr 

被翻译成

generator.map(v => expr) 

当你在左边的模式匹配,那么不匹配模式中的任何输入值将被过滤掉。这意味着创建包含匹配的部分函数,​​并且可以使用例如isDefinedAt来测试每个输入参数。

val f: PartialFunction[JValue, JObject] = { case [email protected](_) => 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)