#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専用の自動化ツールをオーダーメイドで作成しています。気になる方は こちらをご覧ください。

コメント

このブログの人気の投稿

#25 Rustで学ぶAI API(ChatGPT等)の呼び出し方の基本

#8 C++で学ぶ文字列操作の基本

#16 TypeScriptで学ぶ辞書型(マップ)の基本