11

次の 2 つのステートメントに違いはありますか。彼らは同じ目的を達成しますよね?それらは同じ Java コードにコンパイルされますか? それらの間にパフォーマンスの違いはありますか、それとも単に好み/読みやすさの問題ですか?

for (thing <- things) {
    doSome(thing)
}

things.foreach(
  thing =>
    doSome(thing)
)
4

4 に答える 4

15

それらは同一です。与えられた

class Foreach {
  val things = List(1,2,3)
  def doSome(i: Int) { println(i) }
  def one { for (thing <- things) { doSome(thing) } }
  def two { things.foreach{ thing => doSome(thing) } }
}

バイトコードは

public void one();
  Code:
   0:   aload_0
   1:   invokevirtual   #40; //Method things:()Lscala/collection/immutable/List;
   4:   new #42; //class Foreach$$anonfun$one$1
   7:   dup
   8:   aload_0
   9:   invokespecial   #46; //Method Foreach$$anonfun$one$1."<init>":(LForeach;)V
   12:  invokevirtual   #52; //Method scala/collection/immutable/List.foreach:(Lscala/Function1;)V
   15:  return

public void two();
  Code:
   0:   aload_0
   1:   invokevirtual   #40; //Method things:()Lscala/collection/immutable/List;
   4:   new #55; //class Foreach$$anonfun$two$1
   7:   dup
   8:   aload_0
   9:   invokespecial   #56; //Method Foreach$$anonfun$two$1."<init>":(LForeach;)V
   12:  invokevirtual   #52; //Method scala/collection/immutable/List.foreach:(Lscala/Function1;)V
   15:  return
于 2013-05-24T21:52:35.200 に答える
1

scala-lang.orgごと:

いつものように、for 式は、foreach、map、withFilter、および flatMap を含む式の代替構文として使用できるため、反復子によって返されるすべての要素を出力するさらに別の方法は次のようになります。

for (elem <- it) println(elem)

「代替構文」は同一を意味します。

于 2013-05-24T21:40:04.137 に答える