collections
- hierarchy of collection classes
Iterate-> Seq, Set ,Map
Seq->IndexedSeq, LinealSeq Set-> Map->
IndexedSeq ...>Array , String(from java) ->Vector LinealSeq->list
(...> 因Array String 不是nature IndexedSeq的subclass, 不能add new super class to a Java class 只能通过impicit wrappers来使它们能够像IndexedSeq一样)
- 所有的collection类型都有一些general methods
- map
- flatmap
- filter
- foldLeft
- foldRight
val numbers = List(5, 4, 8, 6, 2)//列表 //0已经暗示了类型 numbers.fold(0) { (z, i) => z + i }//result 25
//将0赋值给第一个参数,对列表中每一项赋值给第二个参数i 求得的和继续赋值给第一个参数
//即fold函数返回的值继续作为后续操作的参数知道collection遍历结束
//类与伴生
class Foo(val name:String,val age:Int,val sex:Symbol)
object Foo{
def apply(name:String, age:Int, sex:String) = new Foo(name,age,sex)
}
val fooList =
Foo("Hugh Jass"
,
25
,
'male
)::Foo("wyq", 33, `female)::Nil
//val 变量 为类的成员函数的调用,stringList为List[String]类型变量即函数返回类型。
//调用格式classname.funcname(paratype){(para)=> operations1;operations2}
//调用需知谁传入什么调了什么,得到什么 {}中不涉及类型,只涉及对传入变量的操作及结果
//在=后指明类型与函数名
val stringList = fooList.foldLeft(List[String]()) { (z, f) =>
val title = f.sex match { case 'male => "Mr." case 'female => "Ms." } z :+ s"$title ${f.name}, ${f.age}" }
//f依次取fooList中元素 输出为s"$title ${f.name}, ${f.age}"
//z 最初为Nil,后:+作为累加器 类型为List[String]
//注意$ ${} 区别
foldLeft从左开始遍历。实现:
def fold[A1 >: A](z: A1)(op: (A1, A1) => A1): A1 = foldLeft(z)(op)
//def funcname[returntype](需要从外部传入的para:paratype)(op:(para1type,para2type)=>returntype):returntypename ={具体操作}
//为什么出现两次returntype def foldLeft[B](z: B)(op: (B, A) => B): B = { var result = z this.seq foreach (x => result = op(result, x)) result } //z为参数,取类型B,foldLeft返回result 类型为B. this为所在collection类
//为什么需要在调用时继续写((x,y)=>op(y,x)) def foldRight[B](z: B)(op: (A, B) => B): B = reversed.foldLeft(z)((x, y) => op(y, x))
1 传入的初始值必须是list元素类型的超类
2传入值中立,不影响结果 0 1 Nil
- map filter flatmap link
From satrys,
Kristen wang