withFilter instead of filter

前端 未结 6 991
我寻月下人不归
我寻月下人不归 2020-11-28 07:05

Is it always more performant to use withFilter instead of filter, when afterwards applying functions like map, flatmap etc.?

Why are only map, flatmap and fore

6条回答
  •  余生分开走
    2020-11-28 08:00

    In addition of the excellent answer of Shadowlands, I would like to bring an intuitive example of the difference between filter and withFilter.

    Let's consider the following code

    val list = List(1, 2, 3)
    var go = true
    val result = for(i <- list; if(go)) yield {
       go = false
       i
    }
    

    Most people expect result to be equal to List(1). This is the case since Scala 2.8, because the for-comprehension is translated into

    val result = list withFilter {
      case i => go
    } map {
      case i => {
        go = false
        i
      }
    }
    

    As you can see the translation converts the condition into a call to withFilter. Prior Scala 2.8, for-comprehension were translated into something like the following:

    val r2 = list filter {
      case i => go
    } map {
      case i => {
        go = false
        i
      }
    }
    

    Using filter, the value of result would be fairly different: List(1, 2, 3). The fact that we're making the go flag false has no effect on the filter, because the filter is already done. Again, in Scala 2.8, this issue is solved using withFilter. When withFilter is used, the condition is evaluated every time an element is accessed inside a map method.

    Reference: - p.120 ,Scala in action (covers Scala 2.10), Manning Publications, Milanjan Raychaudhuri - Odersky's thoughts about for-comprehension translation

提交回复
热议问题