我有一个Scala TimeSpan roundedHours = RoundTimeSpanUp(span, TimeSpan.FromHours(1));
,我使用List[String]
方法将List转换为Stream。
toStream
现在,这两者之间的差异是val list = List("shankar","ramesh","aarush","bujji")
val stream = list.toStream
评估的。
lazy
答案 0 :(得分:1)
一个区别是他们的回归类型,所以你可以用结果做什么。您可以对Stream
进行模式匹配,使其headOption
,mkString
等等; FilterMonadic
的唯一方法是map
,foreach
,flatMap
和withFilter
。
如果您将list.withFilter
的结果分配给变量,然后使用它(通过调用FilterMonadic
方法之一:map
,foreach
或flatMap
)多次,它将迭代整个列表并每次检查每个元素的谓词;如果你对list.toStream.filter
做同样的事情,它只会迭代原始列表一次(可能不会到最后,具体取决于你究竟做了什么)。
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