2016-11-06 7 views
1

私はScala List[String]を持っており、toStreamメソッドを使用してリストをストリームに変換しました。Scala - Stream APIフィルタメソッドとリストwithFilterメソッドの違い

val list = List("shankar","ramesh","aarush","bujji") 
val stream = list.toStream 

は現在、これらの2つの両方lazyを評価さの違いは何ですか。

println(list.toStream.filter { x => x.equals("bujji") }) 
println(list.withFilter { x => x.equals("bujji") }) 

答えて

1
  1. 1つの違いは、あなたが結果で何ができるかので、その戻り値の型であると。 Streamとパターンマッチし、そのheadOptionmkStringなどを取ることができます。 FilterMonadicの唯一の方法はmap,foreach,flatMapおよびwithFilterである。

  2. あなたが変数にlist.withFilterの結果を代入し、それを使用している場合(FilterMonadicのいずれかの方法で呼び出すことにより:mapforeach、またはflatMap)を複数回、それはリスト全体を反復処理すると上の述語をチェックします毎回各要素。 list.toStream.filterと同じことをすると、元のリストを1回だけ繰り返します(正確に何をするかによっては、最後までは繰り返されません)。

  3. Stream#filterは遅延が少ない:最初に満足できる要素(存在する場合)を見つける必要があります。

アクションで2と3を参照するには、次の

val listWithFilter = list.withFilter { x => println(s"Checking $x for listWithFilter"); x.equals("bujji") } 
val filteredStream = stream.filter { x => println(s"Checking $x for filteredStream"); x.equals("bujji") } 

listWithFilter.foreach { x => println(s"listWithFilter contains $x") } 
listWithFilter.foreach { x => println(s"listWithFilter contains $x") } 

filteredStream.foreach { x => println(s"filteredStream contains $x") } 
filteredStream.foreach { x => println(s"filteredStream contains $x") } 

Checking shankar for filteredStream 
Checking ramesh for filteredStream 
Checking aarush for filteredStream 
Checking bujji for filteredStream 
Checking shankar for listWithFilter 
Checking ramesh for listWithFilter 
Checking aarush for listWithFilter 
Checking bujji for listWithFilter 
listWithFilter contains bujji 
Checking shankar for listWithFilter 
Checking ramesh for listWithFilter 
Checking aarush for listWithFilter 
Checking bujji for listWithFilter 
listWithFilter contains bujji 
filteredStream contains bujji 
filteredStream contains bujji 
+0

を生成 'list.withFilter'は、リストを反復しません。 – Dima

+0

@Dime _Use_ of 'list.withFilter'はリストを反復処理します。 –

+0

Hm。それはあなたが使用している_how_に依存します。たとえば、 'println(list.withFilter(_ => true))'はリストを反復処理しません。 '.map'は最も確かにそうですが、' list.toStream.filter ... 'の上にマップします。 – Dima

関連する問題