我是scala的新手,并搜索了很多解决方案。 我查询数据库并存储解析为json4s对象的http请求的值作为响应。我等待响应并解析json。
Either[Error,Code]
我想运行一个循环并检查" name"的值是否为返回的数据中存在。如果存在,我想打破并将checkVal分配给false。到目前为止,我有这个:
Either[String, JsValue]
Eclipse给出了以下错误:类型不匹配;发现:需要清单[单位]: 列表[字符串] 请指教。谢谢。
答案 0 :(得分:2)
你的一个问题是你在yield中有不同的返回类型:if t == name,return type是break的类型,如果t!= name return type是Boolean。
在scala中,您没有 break 运算符,这种行为是使用breakable
构造并调用break()
方法实现的,该方法实际上会抛出异常以退出breakable
块。您还可以使用if
正文中的for
语句来过滤结果:
import scala.util.control.Breaks._
breakable {
for {
JObject(obj) <- data
JField("nameValue", JString(t)) <- obj
if t == name
} yield {
checkVal = false
break()
}
}
更新: 我使用这种命令式方法,因为你是scala的新手,但它不是scala方式。恕我直言,你应该在你的问题的评论中坚持@Imm代码。
答案 1 :(得分:0)
我实际上不喜欢在for循环中使用模式匹配,好像由于某种原因数据不是JObject,它不会得到很好的处理。我更喜欢下面的方法。
data match {
case JObject(fields) => fields.exists{
case (name:String,value:JString) => name == "nameValue" && value.s == "name"
case _ => false
}
case _ => false // handle error as not a JObject
}
修改:修改为包含您的匹配。
答案 2 :(得分:0)
我建议使用exists
,因为它对所有集合成员都很懒惰。
代码: -
val list= Map(
"nameValue1" -> 1,
"nameValue2" -> 2,
"nameValue3" -> 3,
"nameValue4" -> 4,
"nameValue5" -> 5
)
val requiredHeader = "nameValue2"
var keyvalue:Int=0
list.exists(p=>{ if(p._1.equalsIgnoreCase(requiredHeader))keyvalue=p._2;p._1.equalsIgnoreCase(requiredHeader) })
if(keyvalue!=0){
//header present
}else{
//header doesn't exit
}