我有一个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
没有返回任何值。
答案 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。