0

我有一个要转换为 Scala 的 Java 代码:

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

     return super.myMethod(str1);   
   }

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

我该如何解决这个问题?

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

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

4

1 回答 1

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))

它将首先选择您可以调用方法的项目,或者如果没有这样的项目,则默认为超级。

于 2013-06-22T09:37:07.187 回答