【scala初學】Trait Iterable

collections.png

   在scala集合的整個層級結構,Iterable僅次於Traverable

  (書生注:原句:All methods in this trait are defined in terms of an an abstract method, 個人根據上下文,這裏應該多了一個“an”

   Iterable中的所有方法藉助一個抽象方法的被定義,該方法是: iterator, 它用於一個一個的產生集合元素。 繼承於Traversableforeach方法藉助的iterator 實現如下:

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

Iterable的相當一部分子類都重寫了標準的foreach方法,因爲他們能夠提供更有效的實現。謹記foreach是Traversable所有方法實現的基礎,他決定性能好壞。


Iterator中有兩個以上的方法返回迭代器iterators: grouped 和 sliding。 然而這些iterators,不返回單獨的元素,而是返回原始集合元素的子序列。這些子序列最大尺寸會作爲一個參數給出到這些方法中。grouped以“塊”增量的方式返回他的元素,sliding產生一個滑動“window”貫穿所有元素。下面通過REPL【 書生:----讀取-求值-輸出”循環(英語:Read-Eval-Print Loop,簡稱REPL)  】 的交互式,來讓我們清楚的理解他們的區別:

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.


Trait Iterable中的操作

WHAT IT ISWHAT IT DOES
Abstract Method:
xs.iterator產生xs的任何元素的迭代器。與foreach遍歷順序相同
Other Iterators:
xs grouped size一個迭代器,用於產生這個集合固定大小的“塊”
xs sliding size一個迭代器,用於產生該集合元素的一個滑動固定大小的窗口
Subcollections:
xs takeRight nxs最後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. 

對於Map ,  例子如下: Map('a' -> 1, 'b' -> 10, 'c' -> 100)('b') 返回10



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章