【scala初学】Trait Iterable

collections.png

   在scala集合的整个层级结构,Iterable仅次于Traverablehtml

  (书生注:原句:All methods in this trait are defined in terms of an an abstract method, 我的根据上下文,这里应该多了一个“an”git

   Iterable中的全部方法借助一个抽象方法的被定义,该方法是: iterator, 它用于一个一个的产生集合元素。 继承于Traversableforeach方法借助的iterator 实现以下:es6

def foreach[U](f: Elem => U): Unit = {
  val it = iterator
  while (it.hasNext) f(it.next())
}

Iterable的至关一部分子类都重写了标准的foreach方法,由于他们可以提供更有效的实现。谨记foreach是Traversable全部方法实现的基础,他决定性能好坏。
api


Iterator中有两个以上的方法返回迭代器iterators: grouped 和 sliding。 然而这些iterators,不返回单独的元素,而是返回原始集合元素的子序列。这些子序列最大尺寸会做为一个参数给出到这些方法中。grouped以“块”增量的方式返回他的元素,sliding产生一个滑动“window”贯穿全部元素。下面经过REPL【 书生:----读取-求值-输出”循环(英语:Read-Eval-Print Loop,简称REPL)  】 的交互式,来让咱们清楚的理解他们的区别:app

scala> val xs = List(1, 2, 3, 4, 5)
xs: List[Int] = List(1, 2, 3, 4, 5)
scala> val git = xs grouped 3
git: Iterator[List[Int]] = non-empty iterator
scala> git.next()
res3: List[Int] = List(1, 2, 3)
scala> git.next()
res4: List[Int] = List(4, 5)
scala> val sit = xs sliding 3
sit: Iterator[List[Int]] = non-empty iterator
scala> sit.next()
res5: List[Int] = List(1, 2, 3)
scala> sit.next()
res6: List[Int] = List(2, 3, 4)
scala> sit.next()
res7: List[Int] = List(3, 4, 5)

只要迭代器可用,Trait iterable 可以增长一些其余有效的实现到Traversable.
ide


Trait Iterable中的操做
oop

WHAT IT IS WHAT IT DOES
Abstract Method:
xs.iterator 产生xs的任何元素的迭代器。与foreach遍历顺序相同
Other Iterators:
xs grouped size 一个迭代器,用于产生这个集合固定大小的“块”
xs sliding size 一个迭代器,用于产生该集合元素的一个滑动固定大小的窗口
Subcollections:
xs takeRight n xs最后n个元素组成的集合(又或者,若是没有顺序,返回任意n个元素)
xs dropRight n 除了 xs takeRight n  剩余的元素
Zippers:
xs zip ys 返回 Iterable[(AB)], 元素是 xs 和 ys中相应的元素对
xs zipAll (ys, x, y) 返回Iterable[(AB)]元素xs 和 ys中相应的元素对,较短的序列将会扩展用语匹配较长的序列,追加元素x 或者 y
xs.zipWithIndex 返回Iterable[(AInt)], 经过他们的索引位置,造成一对元素
Comparison:
xs sameElements ys 测试xs和ys以一样的顺序包含了一样的元素


在Trait Iterable下面的集成层次结构中,有三个Trait:  SeqSet, and Map. 三个接口有个共同点是都实现 PartialFunction接口的applyisDefinedAt方法然而,实现方式又略有不一样。性能


对于序列(Seq), apply是位置索引,启示是0. 即:Seq(1,2,3)(1) 结果是2.  测试

对于Set, apply是对元素的测试 Set('a','b','c')('b')返回是true ,而Set()('a') 返回false. this

对于Map ,  例子以下: Map('a' -> 1, 'b' -> 10, 'c' -> 100)('b') 返回10