2016-11-06 1 views
1

У меня есть Scala List[String], я преобразовал List to Stream с помощью метода toStream.Scala - Разница между методом фильтра Stream API vs List withFilter method

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

Теперь то, что разница между этими двумя, оба lazy оценены.

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

ответ

1
  1. Одно из отличий является их тип возвращаемого значения и так, что вы можете сделать с результатом. Вы можете сопоставить рисунок Stream, взять его headOption, mkString и т. Д .; применяются только методы FilterMonadic: map, foreach, flatMap и withFilter.

  2. Если присвоить результат list.withFilter переменной, а затем использовать его (с помощью одной из FilterMonadic методов: map, foreach или flatMap) несколько раз, он будет перебирать весь список и проверить предикат каждый элемент каждый раз; если вы сделаете то же самое с list.toStream.filter, он будет перебирать только исходный список один раз (и, возможно, не до конца, в зависимости от того, что именно вы делаете).

  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. Это зависит от того, как вы его используете. Например, 'println (list.withFilter (_ => true))' НЕ выполняет итерацию по списку. '.map' наверняка будет ... но так будет отображаться над' list.toStream.filter ... ' – Dima

Смежные вопросы