返回一个 Traversable 对象的视图view
package main object Test { def main(args: Array[String]): Unit = { val t1 = Traversable(1 to 10: _*); println(t1); //List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) var view = t1.view(1, 5); println(view.getClass.getName); //scala.collection.SeqViewLike$$anon$7 println(view); //SeqViewS(...) view.foreach(x => { print(x + " "); }); //2 3 4 5 println(view.mkString(",")); //2,3,4,5
view = t1.view; println(view); //SeqView(...) println(view.mkString(",")); //1,2,3,4,5,6,7,8,9,10 } }
view() 可以生成从 from 到 until 返回的视图,不包含 until 位置的元素。
如果没有指定 from 和 until,则返回全部元素的视图。
slice 与 view 的区别在于:view 产生一个当前序列的非严格模式视图,意味着元素是延迟计算的,只有在需要的时候才计算元素。
如果想得到它的严格模式的集合,则可以调用它的 force 方法。
slice会立即产生一个新的集合。
package main object Test { def main(args: Array[String]): Unit = { val seq = scala.collection.mutable.Seq(1 to 5: _*); var view = seq.toTraversable.view(1, 3); val slice = seq.toTraversable.slice(1, 3); view.foreach(x => print(x + " ")); //2 3 println(slice); //ArrayBuffer(2, 3) seq(1) = 200; //修改值 view.foreach(x => print(x + " ")); //200 3 println(slice); //ArrayBuffer(2, 3) } }
基于 mutable.Seq 生成一个视图,然后更改原始集合(Seq)对象的元素值,seq(1) = 200;
因为视图的元素是延迟计算的,所以第二次 view 它会打印更改后的元素值(200)。

浙公网安备 33010602011771号