2013-06-22 54 views
0

我有我要轉換爲斯卡拉一個Java代碼:如果我在Scala中使用for歸來「的」 Scala中是不一樣的回報「爲」在Java中

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

    return super.myMethod(str1); 
    } 

,它將被翻譯爲map,即在map內調用return將剛剛從map返回值,但它不會停止myMethod的執行。但是我希望它的行爲與此Java代碼中的行爲完全相同。

我該如何解決這個問題?

UPDATE:我的意思是,我必須用foreach而不是for。但是,從foreach調用return僅從foreach返回值,並且不會停止執行myMethod

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

+1

你可以顯示你的審判scala代碼? – fge

+0

foreach不是像java這樣的一個表達式,它的一個集合函數,它只會在你的地圖內的每個項目上調用一個函數,你也需要使用for表達式,像@ rex-kerr解釋 –

+0

'項目。 find(item =>/* some condition */&&/* another condition * /)。fold(super.myMethod(str1))(_。myMethod123())' –

回答

7

它其實停止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)) 

這將首先對挑選出的項目你可以調用一個方法,或者如果沒有這樣的項目,它將默認爲超級。