2011年6月1日水曜日

ScalaのOptionやListのfilterとwithFilterの違い

Option,Listには
filter
withFilter
の2種類のメソッドが存在します。
どちらも引数は
T => Boolean

でFilterの処理を行いますが、ほかのmapや多段のfilterを組み合わせる場合違いが出てきます。

以下が実際の実行結果の違いです。
どちらも、偶数だけを取り出して、2倍をしたリストを取得しています。


val l = List(1,2,3,4)

l.withFilter( i => {
println("fitler " + i)
i % 2 == 0
}).map( i => {
println("map " + i)
i * 2
})


l.filter( i => {
println("fitler " + i)
i % 2 == 0
}).map( i => {
println("map " + i)
i * 2
})



実行結果は以下のようになります。


//withFilter -> map
fitler 1
fitler 2
map 2
fitler 3
fitler 4
map 4
fitler 5

//filter -> map
fitler 1
fitler 2
fitler 3
fitler 4
fitler 5
map 2
map 4



filterを使用した場合、途中でfilterされたListが生成されてしまいますが、
withFilterを使用した場合、中間状態のListは生成されません。
もし、filterやmapを何段も使用する場合はwithFilterを使ったほうがパフォーマンスが高くなります。

0 件のコメント:

コメントを投稿