Scala - Stream API Filter方法与List withFilter方法之间的区别

时间:2016-11-06 16:31:01

标签: scala scala-collections

我有一个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

1 个答案:

答案 0 :(得分:1)

  1. 一个区别是他们的回归类型,所以你可以用结果做什么。您可以对Stream进行模式匹配,使其headOptionmkString等等; FilterMonadic的唯一方法是mapforeachflatMapwithFilter

  2. 如果您将list.withFilter的结果分配给变量,然后使用它(通过调用FilterMonadic方法之一:mapforeachflatMap)多次,它将迭代整个列表并每次检查每个元素的谓词;如果你对list.toStream.filter做同样的事情,它只会迭代原始列表一次(可能不会到最后,具体取决于你究竟做了什么)。

  3. Stream#filter不那么懒:它需要立即找到第一个令人满意的元素(如果存在)。

  4. 要看到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
    
相关问题