在Scala中从“for”返回与在Java中从“for”返回不同

时间:2013-06-22 09:18:27

标签: java scala

我有一个Java代码,我想将其转换为Scala:

    MyClass myMethod(String str1) {
      for (Item item: items) {
        if (/* some condition */) {
          if(/* another condition */) {
            return item.myMethod123();
          }
        }
     }

     return super.myMethod(str1);   
   }

如果我在Scala中使用for,它将被翻译为map,在return内调用map只会返回map的值,但它不会阻止myMethod执行。但我希望它的行为与此Java代码中的行为完全相同。

我该如何解决这个问题?

更新:我的意思是,我必须使用foreach代替for。但是,从return调用foreach只是从foreach返回值而不是停止myMethod执行。

UPDATE2 :我很困惑,foreach没有返回任何值。

1 个答案:

答案 0 :(得分:6)

实际上 将停止myMethod执行,因为它在幕后实际上会抛出一个(无堆栈跟踪)异常,该异常在实际返回之前被myMethod捕获。所以你只是

def myMethod(str1: String) {
  for (item <- items) {
    if (/*some cond*/) {
      if (/*other cond*/) {
        return item.myMethod123
      }
    }
  }
  super.myMethod(str1)
}

“就像在Java中一样。”

代码工作正常;它只是没有那么快,因为涉及到一个例外。 (堆栈跟踪是大部分时间都需要的,因此除非它是一个频繁使用的循环,否则你可能在这里没问题。)

或者,你可以

val target = items.find{ item => 
  if (/* some cond */) { 
    /*other cond*/
  }
  else false
}
target.map(_.myMethod123()).getOrElse(super.myMethod(str1))

首先会选出你可以调用方法的项目,或者如果没有这样的项目,则默认为super。