【发布时间】:2015-07-04 18:05:59
【问题描述】:
我是 scala 的新手,并且搜索了很多解决方案。 我正在查询数据库并将解析为 json4s 对象的 http 请求的值作为响应存储。我等待响应并解析 json。
val refService = url("http://url//)
val response = Http(refService OK dispatch.as.json4s.Json)
var checkVal :Boolean = true
val json = Await.result(response, 30 seconds)
val data = json \ "data"
我想运行一个循环并检查“name”的值是否存在于返回的数据中。如果存在,我想打破并将 checkVal 分配给 false。到目前为止,我有这个:
for {
JObject(obj) <- data
JField("nameValue", JString(t)) <- obj //nameValue is the column name in the returned data
} yield {checkVal= if (t == name){ break }
else
true
}
Eclipse 给我以下错误:类型不匹配;找到:需要列表[单位]: 列表[字符串] 请指教。谢谢你。
【问题讨论】:
-
在 scala 中,您应该尝试从这些命令式概念(“运行循环”)中退后一步,并表达更高级别的意图。比如:
val checkVal = obj.find(jf => jf.fieldName == "nameValue").map(_.value ==t).getOrElse(true)(我不知道具体的 API,但希望你明白)? -
对不起,如果这是愚蠢的问题。但我在这里假设 checkVal 是一个布尔值?你能解释一下
.map(_.value ==t)做了什么吗?谢谢。 -
这是对
Option上的.map的调用(find的返回类型) - 理解这些内容的最简单方法是将其放入 IDE 并点击进入函数定义。如果选项存在,map基本上将给定函数应用于选项中的值。_.value==t是一个匿名函数,它是一种简洁的书写方式,例如{jsonField => jsonField.value == t}
标签: scala