返回一个 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)。

 

posted @ 2019-07-21 12:59  茗::流  阅读(81)  评论(0)    收藏  举报
如有雷同,纯属参考。如有侵犯你的版权,请联系我。