次の 2 つのステートメントに違いはありますか。彼らは同じ目的を達成しますよね?それらは同じ Java コードにコンパイルされますか? それらの間にパフォーマンスの違いはありますか、それとも単に好み/読みやすさの問題ですか?
for (thing <- things) {
doSome(thing)
}
things.foreach(
thing =>
doSome(thing)
)
それらは同一です。与えられた
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
scala-lang.orgごと:
いつものように、for 式は、foreach、map、withFilter、および flatMap を含む式の代替構文として使用できるため、反復子によって返されるすべての要素を出力するさらに別の方法は次のようになります。
for (elem <- it) println(elem)
「代替構文」は同一を意味します。