您的位置:首页 > 大数据 > 人工智能

[scala--基础]--Trait Iterable

2016-08-14 15:20 316 查看


Trait Iterable

自下而上的容器(collection)层次结构具有可迭代的Trait。Trait的所有方法可定义为一个抽象方法,逐个生成容器(collection)元素迭代器。Traversable Trait的foreach方法实现了迭代器的Iterable。下面是具体的实现。

def foreach[U](f: Elem => U): Unit = {

val it = iterator

while (it.hasNext) f(it.next())

}


许多Iterable 的子类覆写了Iteable的foreach标准实现,因为它们提供了更多有效的实现。记住,由于性能问题,foreach是Traversable所有操作能够实现的基础。

Iterable有两个方法返回迭代器:grouped和sliding。然而,这些迭代器返回的不是单个元素,而是原容器(collection)元素的全部子序列。这些最大的子序列作为参数传给这些方法。grouped方法返回元素的增量分块,sliding方法生成一个滑动元素的窗口。两者之间的差异通过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增加了一些其他方法,为了能被有效的实现的可遍历的情况。这些方法总结在下面的表中。


Trait Iterable操作

WHAT IT ISWHAT IT DOES
抽象方法: 
xs.iteratorxs迭代器生成的每一个元素,以相同的顺序就像foreach一样遍历元素。
其他迭代器: 
xs grouped size一个迭代器生成一个固定大小的容器(collection)块。
xs sliding size一个迭代器生成一个固定大小的滑动窗口作为容器(collection)的元素。
子容器(Subcollection): 
xs takeRight n一个容器(collection)由xs的最后n个元素组成(或,若定义的元素是无序,则由任意的n个元素组成)。
xs dropRight n一个容器(collection)由除了xs 被取走的(执行过takeRight ()方法)n个元素外的其余元素组成。
拉链方法(Zippers): 
xs zip ys把一对容器 xs和ys的包含的元素合成到一个iterabale。
xs zipAll (ys, x, y)一对容器 xs 和ys的相应的元素合并到一个iterable ,实现方式是通过附加的元素x或y,把短的序列被延展到相对更长的一个上。
xs.zip WithIndex把一对容器xs和它的序列,所包含的元素组成一个iterable 。
比对: 
xs sameElements ys测试 xs 和 ys 是否以相同的顺序包含相同的元素。
在Iterable下的继承层次结构你会发现有三个traits:SeqSet,和 Map。这三个Traits有一个共同的特征,它们都实现了PartialFunction trait以及它的应用和isDefinedAt
方法。然而,每一个trait实现的PartialFunction 方法却各不相同。

例如序列,使用用的是位置索引,它里面的元素的总是从0开始编号。即
Seq(1, 2, 3)(1) 
为2。例如sets,使用的是成员测试。例如
Set('a',
'b', 'c')('b') 
算出来的是true,而
Set()('a')
为false。最后,maps使用的是选择。比如
Map('a'
-> 1, 'b' -> 10, 'c' -> 100)('b')
 得到的是10。

拉链操作:

package study

/**
* Document:本类作用---->拉链操作
* User: yangjf
* Date: 2016/8/14  15:15
*/
object TestZip {
def main(args: Array[String]) {
val list1=List(1,2,3,4,12)
val list2=List(5,6,7,8,9)
//拉链操作
val ends=list1.zip(list2)
println("List拉链结果:"+ends)
}
}

/**

拉链结果:List((1,5), (2,6), (3,7), (4,8), (12,9))

*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: