Scala Documentation

book notebook : Scala Documentation

Collection

Iterable是一个trait,它的foreach方法(来自于另一个trait:Traversable)使用iterator实现.

1
2
3
4
def foreach[U](f: Elem => U): Unit = {
val it = iterator //迭代器有next方法获取下一个原始和hasNext判断是否有下一个原始
while (it.hasNext) f(it.next()) //foreach的参数是个函数,因为foreach是个高阶函数
}

比如Learning Scala中的

1
2
3
class Singular[A](element: A) extends Traversable[A] {
def foreach[B](f: A => B) = f(element)
}

Iterable的grouped和sliding也会返回迭代器,所以为了获取迭代器中的元素,必须基于迭代器不断调用next:

1
2
3
4
5
6
7
8
9
val xs = List(1, 2, 3, 4, 5)
val git = xs.grouped(3)
git.next //List(1,2,3)
git.next //List(4,5)

val sit = xs.sliding(3)
sit.next //List(1, 2, 3)
sit.next //List(2, 3, 4)
sit.next //List(3, 4, 5)

Seq,Set,Map都实现了PartialFunction. Seq的apply:根据索引获取元素, Set:判断是否存在, Map:根据key选择value

不可变集合+可变变量

1
2
3
4
var s = Set(1,2,3)  //不可变集合Set,但是声明为可变变量
s += 4 //因为是可变变量,所以可以更改变量的值
s -= 2 //在不可变集合s上运用方法+,并把结果赋回给变量s
s

可变集合+不可变变量

1
2
3
4
val s = collection.mutable.Set(1, 2, 3)     //可变集合, 用不可变变量. 虽然不可变变量不能修改,但是可变集合本身是可以修改的
s += 4 //在可变集合值s上调用+=方法,它会改变s的内容: 添加元素到集合s中,并返回产生变化后的集合作为运算结果
s -= 2
s

对于可变集合或不可变集合, 如果都用val不可变变量声明. 它们都有+方法,都会生成一个新的集合,原集合不变.
注意如果是不可变集合, 不可变变量, 则没有+=方法. 使用可变变量+不可变集合,才有+=方法.不过+=操作不是集合上的操作,而是更新变量


文章目录
  1. 1. Collection