为什么有这么多Scala集合视图类型?

时间:2013-04-17 16:25:50

标签: scala collections lazy-evaluation

我是Scala的新手,所以我试图理解为什么对视图的调用会返回IndexedSeqViewS和类似类的实例。为什么每个操作都需要一个不同的类?

1 个答案:

答案 0 :(得分:3)

因为每个视图转换操作(即生成新视图的操作,如mapfilterslice)都会创建一个以不同方式遍历底层集合的视图。 请注意,IndexedSeqViewS不是该集合类的实际名称 - 它是toString返回的美化名称。

例如,Mapped视图创建了基础集合的视图,以便以某种方式转换基础集合的每个元素。

这需要重新定义foreach,如下所示:

  trait Mapped[B] extends Transformed[B] {
    // ...
    def foreach[U](f: B => U) {
      for (x <- self)
        f(mapping(x))
    }
    // ...
  }

Filtered视图要求在遍历时忽略一些元素:

  trait Filtered extends Transformed[A] {
    // ...
    def foreach[U](f: A => U) {
      for (x <- self)
        if (pred(x)) f(x)
    }
    // ...
  }

由于集合具有基于继承的设计,要覆盖foreach(以及applysize等其他方法)的定义,需要引入子类。在一些替代设计中,例如,一个基于类型类,可能必须引入一个单独的类型类来重新定义特定类型的foreach