2016-11-06 5 views
1

스칼라 List[String]을 가지고 있는데, toStream 메서드를 사용하여 List to Stream을 변환했습니다. 이 둘 사이의 차이입니다 이제 어떻게스칼라 - 스트림 API 필터 메서드와 목록의 차이점 withFilter 메서드

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, flatMapwithFilter입니다.

  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

흠. 그것은 당신이 그것을 사용하는 _how_에 달려 있습니다. 예를 들어,'println (list.withFilter (_ => true))'는리스트를 반복 처리하지 않습니다. '.map'은 가장 확실한 것이지만,'list.toStream.filter ... '에 매핑 될 것입니다. – Dima