package com.test1 object Scala09_test10 { def main(args: Array[String]): Unit = { //作为对象的函数 //我们可以将方法以对象的形式作为参数给其他方法 //为了实现这一点,需要函数对象来打包方法,函数对象简称为函数 //例如foreach对于像vector这样的序列来说是一个非常有用的方法 //它接受参数,并将其应用到序列中每个元素上。 def show(n:Int):Unit = {println("> "+n)} val v:Vector[Int] = Vector(1,2,3,4) v.foreach(show) v.foreach(n=>{println("> "+n)}) var s = "" val duck = "Duck".toVector duck.foreach(n=>s=s+n+":") println(s) val v1:Vector[Int] = Vector(19,1,7,3,2,14) println(v1.sorted) println(v1.sortWith((i,j)=>jUnit){ def call():Unit={ f() } } val cl = new Later( ()=>println("now")) cl.call() //甚至可以将匿名函数赋给一个var或val val later1 = ()=>println("now") val later2 = ()=>println("now") later1.apply() later2.apply() //map和reduce在前一个原子中,我们通过foreach这个 val v2 = Vector(1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4) v2.map(n=>(n,n+1)) println(v2.map(n=>(n,1))) } }
在前一个原子中,我们通过foreach这个例子学习了匿名函数数的知识,尽管foreach非常有用,但是仍有局限性 ,
因为使用它只是为了其副作用,
初学scala者肯定会对:: , +:, :+, :::, +++,这些操作有些疑惑,今天总结一下,方便大家的使用 package test /** * scala中的:: , +:, :+, :::, +++, 等操作; */ object listTest { def main(args: Array[String]): Unit = { val list = List(1,2,3) // :: 用于的是向队列的头部追加数据,产生新的列表, x::list,x就会添加到list的头部 println(4 :: list) //输出: List(4, 1, 2, 3) // .:: 这个是list的一个方法;作用和上面的一样,把元素添加到头部位置; list.::(x); println( list.:: (5)) //输出: List(5, 1, 2, 3) // :+ 用于在list尾部追加元素; list :+ x; println(list :+ 6) //输出: List(1, 2, 3, 6) // +: 用于在list的头部添加元素; val list2 = "A"+:"B"+:Nil //Nil Nil是一个空的List,定义为List[Nothing] println(list2) //输出: List(A, B) // ::: 用于连接两个List类型的集合 list ::: list2 println(list ::: list2) //输出: List(1, 2, 3, A, B) // ++ 用于连接两个集合,list ++ list2 println(list ++ list2) //输出: List(1, 2, 3, A, B) } }
推导
package com.test1 object Scala09_test11 { def main(args: Array[String]): Unit = { val v1 = Vector(1,2,3,4,5,6,7,8) val v2 = v1.map(i=>(i,1)) val v3 = Vector(1,10,100,1000) var sum = 0 //v3.reduce((sum,n)=>{sum=sum+n,sum)} //println(sum) //v2.reduce((vx,1)=>{vx._1,)) println(v3.reduce((sum,n)=>sum+n)) // v2.reduce((item,v)=>(v._1,v._2=v._2+1)) println((1 to 100).reduce((sum,n)=>sum+n)) println(Vector("D","u","c","k").reduce((sum,n)=>sum+":"+n)) //推导,现在,你已经准备好了,可以开始学习有关强有力的for和if的组合的知识了, //这种组合称为for推导了,或者简称为推导 def evenGT5(v:Vector[Int]):Vector[Int]={ var result = Vector[Int]() for{ n5 if n %2 == 0 }result = result :+ n result } val v = Vector(1,2,3,5,6,7,8,10,13,14,17) println(evenGT5(v)) //注意,rsult并非常见的val,而是var,因此我们可以修改result. //一般情况下,我们总是尝试使用val, def yielding(v:Vector[Int]):Vector[Int]={ val result = for{ n <- v if n < 10 if n %2 !=0 }yield n result } val v20 = Vector(1,2,3,5,6,7,8,10,13,14,17) println(yielding(v20)) case class Persion(name:String) //基于类型的模式匹配 //我们已经看过基于值的模式匹配,还可以按照值的类型来匹配。下面的方法并不关心其参数的类型 def acceptAnything(x:Any):String={ x match { case s:String=>"A String"+s case i:Int if(is"An int less than 20:$i" case i:Int =>s"Some other Int:$i" case p:Persion=>s"A person ${p.name}" case _ =>"I don't know what that is" } } println(acceptAnything(5)) println(acceptAnything(25)) println(acceptAnything(Persion("wjj"))) println(acceptAnything(Vector(1,2,5))) } }