Scalaのリスト操作メモ

C#とLinq大好きな人間が同じようなことをScalaでやろうとしたときにどう書けるかやってみた。

10から20までを連続して出力

10 to 20

笑っちゃうくらい簡単ですね。Intにtoメソッドが定義されていて、ドットと括弧が省略できるのでこう書けちゃいます。

 

10から20のうち、15以上のみを抽出

(10 to 20) filter (n => n >= 15)

まあこのくらいはC#と同じですね。

10から20までの数値を複雑な条件で抽出

(10 to 20) filter {n => val n2 = n * n; n2 > 300}

二行に分けて書きたいとき、ブロックステートメントにするとC#なら(n => {  ..... })みたいな感じに書かなくてはならないので、括弧が連続して若干ダサい印象になります。Scalaのこの方式なら()が減るので幾分か綺麗に書けますね。

Fluent interfaceだって当然書けますよ

var aa = (10 to 20)
filter
{
 n => val n2 = n * n
 n2 > 300
}
map
{
  n => n / 1.5
}
foreach (n => println(n + "aaa"))

まあ内容に意味は無いのだけど、こんな風に直感的に書ける。C#はforeachメソッドは無いけどScalaでは使える。

forにフィルターが統合されてる

for( n <- 1 to 20 if n %2 == 0; if n % 3 == 0) println(n)

forの中にifを書ける。Pythonのリスト内包表記に似ていますね。

forで絞り込んだ内容をリストに抽出

for( n <- 1 to 20 if n %2 == 0; if n % 3 == 0) yield n

こうするとVectorが返ってくる。もしListが良い場合はVector.toListを呼べばよい。ちなみに、1 to 20はRangeが返ってきます。Stream from 10と書くと、終わりが無い10からのStreamが返ってきます。もう何でも書けますね。