如何在Scala中打破/逃避for循环?

时间:2015-07-02 12:55:13

标签: scala

我是scala的新手,并搜索了很多解决方案。 我查询数据库并存储解析为json4s对象的http请求的值作为响应。我等待响应并解析json。

Either[Error,Code]

我想运行一个循环并检查" name"的值是否为返回的数据中存在。如果存在,我想打破并将checkVal分配给false。到目前为止,我有这个:

Either[String, JsValue]

Eclipse给出了以下错误:类型不匹配;发现:需要清单[单位]:      列表[字符串] 请指教。谢谢。

3 个答案:

答案 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
}