#6 Scalaで学ぶループの基本
Scalaのループは、関数型プログラミングという考え方の影響を受けており、他の言語とは少し違う書き方が好まれます。この記事では、Scalaにおけるループの基本と、関数型らしい書き方を解説します。
forによる繰り返し
for (i <- 0 until 5) {
println(i)
}
0 until 5は「0から5未満まで」を表す範囲の書き方です。最後の値を含めたい場合はtoを使います。
for (i <- 0 to 5) {
println(i) // 0から5まで(5を含む)
}
コレクションの中身を処理する
val fruits = List("りんご", "みかん", "ぶどう")
for (fruit <- fruits) {
println(fruit)
}
foreachというもう1つの書き方
Scalaでは、for文の代わりにforeachというメソッドを使う書き方もよく好まれます。
fruits.foreach(fruit => println(fruit))
// より短く書くこともできる
fruits.foreach(println)
これは「fruitsの中身それぞれに対して、この処理を行う」という関数型プログラミングらしい考え方の書き方です。
forとyieldで新しいリストを作る
ループの結果から新しいコレクションを作りたい場合は、forとyieldを組み合わせます。
val doubled = for (i <- fruits) yield i + "!"
println(doubled) // List(りんご!, みかん!, ぶどう!)
同じことはmapメソッドでも書けます。
val doubled = fruits.map(fruit => fruit + "!")
Scalaならではの注意点
Scalaの学習を進めていくと、単純な繰り返しよりも「コレクションに対して処理を行う」という考え方に触れる機会が増えていきます。forとforeach、どちらも同じような結果を得られますが、Scalaらしいコードを書きたい場合は、foreachやmapのような書き方にも早めに慣れておくとよいでしょう。特に、値を作りたいときはfor...yieldやmap、単に処理を実行したいだけのときはforeach、という使い分けを意識すると、コードの意図が伝わりやすくなります。条件に合う要素だけを絞り込みたい場合はfilterも合わせて覚えておくと、繰り返し処理の幅がさらに広がります。
val bigFruits = fruits.filter(f => f.length > 2)
ネストしたループとガード条件
Scalaのfor式は、複数の<-を並べることで、二重ループのような処理もすっきり書けます。さらにifを挟むと、条件に合う組み合わせだけに絞り込めます。
for {
i <- 1 to 3
j <- 1 to 3
if i != j
} println(s"$i, $j")
このように書くと、入れ子のforループとifによる絞り込みを、1つの式としてまとめて表現できます。
まとめ
Scalaのループはforが基本ですが、foreachやfor...yieldのような関数型らしい書き方も広く使われます。ガード条件付きのfor式で複雑な繰り返しもすっきり書けることを覚えておき、目的に応じて使い分けましょう。
本ページはプロモーションを含みます。
参考書籍(PR)
Scalaをもっと学びたい方には「実践Scala入門」がおすすめです。
PR
コードを書かずに自動化したい方へ
「学んだけど自分の作業に組み込む時間がない」という方向けに、ダブルクリックで動く Windows専用の自動化ツールをオーダーメイドで作成しています。気になる方は こちらをご覧ください。
コメント
コメントを投稿