在scala集合的整個層級結構,Iterable僅次於Traverable。html
(書生注:原句:All methods in this trait are defined in terms of an an abstract method, 我的根據上下文,這裏應該多了一個「an」)git
Iterable中的全部方法藉助一個抽象方法的被定義,該方法是: iterator, 它用於一個一個的產生集合元素。 繼承於Traversable的foreach方法藉助的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[(A, B)], 元素是 xs 和 ys中相應的元素對 |
xs zipAll (ys, x, y) | 返回Iterable[(A, B)],元素xs 和 ys中相應的元素對,較短的序列將會擴展用語匹配較長的序列,追加元素x 或者 y |
xs.zipWithIndex | 返回Iterable[(A, Int)], 經過他們的索引位置,造成一對元素 |
Comparison: | |
xs sameElements ys | 測試xs和ys以一樣的順序包含了一樣的元素 |
在Trait Iterable下面的集成層次結構中,有三個Trait: Seq, Set, and Map. 三個接口有個共同點是都實現了 PartialFunction接口的apply和isDefinedAt方法。然而,實現方式又略有不一樣。性能
對於序列(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