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

 

posted on 2017-09-23 00:34  satyrs  阅读(125)  评论(0编辑  收藏  举报

导航