C#とLinq大好きな人間が同じようなことをScalaでやろうとしたときにどう書けるかやってみた。
10から20までを連続して出力
[scala]
10 to 20
[/scala]
笑っちゃうくらい簡単ですね。Intにtoメソッドが定義されていて、ドットと括弧が省略できるのでこう書けちゃいます。
10から20のうち、15以上のみを抽出
[scala]
(10 to 20) filter (n => n >= 15)
[/scala]
まあこのくらいはC#と同じですね。
10から20までの数値を複雑な条件で抽出
[scala]
(10 to 20) filter {n => val n2 = n * n; n2 > 300}
[/scala]
二行に分けて書きたいとき、ブロックステートメントにするとC#なら(n => { ..... })みたいな感じに書かなくてはならないので、括弧が連続して若干ダサい印象になります。Scalaのこの方式なら()が減るので幾分か綺麗に書けますね。
Fluent interfaceだって当然書けますよ
[scala]
var aa = (10 to 20)
filter
{
n => val n2 = n * n
n2 > 300
}
map
{
n => n / 1.5
}
foreach (n => println(n + "aaa"))
[/scala]
まあ内容に意味は無いのだけど、こんな風に直感的に書ける。C#はforeachメソッドは無いけどScalaでは使える。
forにフィルターが統合されてる
[scala]
for( n <- 1 to 20 if n %2 == 0; if n % 3 == 0) println(n)
[/scala]
forの中にifを書ける。Pythonのリスト内包表記に似ていますね。
forで絞り込んだ内容をリストに抽出
[scala]
for( n <- 1 to 20 if n %2 == 0; if n % 3 == 0) yield n
[/scala]
こうするとVectorが返ってくる。もしListが良い場合はVector.toListを呼べばよい。ちなみに、1 to 20はRangeが返ってきます。Stream from 10と書くと、終わりが無い10からのStreamが返ってきます。もう何でも書けますね。