0

Scala コードに変換したい Java コードがあります。

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

     return super.myMethod(str1);   
   }

forScala で使用すると、 に変換されます。つまり、内mapで呼び出すとから値が返されますが、実行は停止しません。しかし、この Java コードとまったく同じように動作するようにしたいと考えています。returnmapmapmyMethod

これを解決するにはどうすればよいですか?

更新:つまり、foreachの代わりに使用する必要がありforます。returnただし、からの呼び出しforeachは値を返すだけであり、実行foreachを停止するわけではありませんmyMethod

UPDATE2 : 混乱foreachしています。値が返されません。

4

1 に答える 1

6

実際には、実際に戻る前にキャッチされる (no-stack-trace) 例外が舞台裏でスローされるため、実行停止します。だからあなたはただmyMethodmyMethod

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 に答える