Scalaのリスト操作メモ

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が返ってきます。もう何でも書けますね。