通过上一小节,我们已经很清楚高阶函数的定义及使用方法了。本节将对Scala集合中常用的高阶函数进行介绍。
(1)map函数
定义:def map[B](f:(A) ⇒B): Array[B]
用途:将函数f应用于数组的所有元素,并返回一个新的数组Array[B]。函数f输入类型为A、返回值类型为B。
在介绍值函数时,已经对Array类型的map函数使用作了介绍。
//Array类型的map函数使用
scala>Array("spark","hive","hadoop").map(_*2)
res1: Array[String] = Array(sparkspark, hivehive,hadoophadoop)
下面再分别给出List类型、Map类型的map函数使用示例,希望能够帮助读者对高阶函数map有更深入的理解。
//List类型的map函数使用
scala> vallist=List("Spark"->1,"hive"->2,"hadoop"->2)
list: List[(String, Int)] = List((Spark,1),(hive,2), (hadoop,2))
//省略值函数的输入参数类型
scala> list.map(x=>x._1)
res20: List[String] = List(Spark, hive, hadoop)
//参数x在=>中只出现一次,进一步简化
scala> list.map(_._1)
res21: List[String] = List(Spark, hive, hadoop)
//Map类型的map函数使用
scala>Map("spark"->1,"hive"->2,"hadoop"->3).map(_._1)
res23: scala.collection.immutable.Iterable[String]= List(spark, hive, hadoop)
scala>Map("spark"->1,"hive"->2,"hadoop"->3).map(_._2)
res24: scala.collection.immutable.Iterable[Int] =List(1, 2, 3)
//非简化写法
scala>Map("spark"->1,"hive"->2,"hadoop"->3).map(x=>x._2)
res25: scala.collection.immutable.Iterable[Int] =List(1, 2, 3)
scala>Map("spark"->1,"hive"->2,"hadoop"->3).map(x=>x._1)
res26: scala.collection.immutable.Iterable[String]= List(spark, hive, hadoop)
(2)flatmap函数
定义:defflatMap[B](f: (A) ⇒ GenTraversableOnce[B]): Array[B]
用途:将函数f作用于集合中的所有元素,各元素得到相应的集合GenTraversableOnce[B],然后再将其扁平化返回,生成新的集合。
scala> vallistInt=List(1,2,3)
listInt: List[Int] =List(1, 2, 3)
//函数作用于各元素时,要求返回的是集合
scala> listInt.flatMap(x=> x match {
case 1 => List(1)
case _ => x
})
<console>:11:error: type mismatch;
found : Int
required:scala.collection.GenTraversableOnce[?]
case _ => x
^
//正确写法
scala> listInt.flatMap(x=> x match {
case 1 => List(1)
case _ => List(x)
})
res1: List[Int] = List(1,2, 3)
了解函数f作用于各元素之后返回的结果类型后,现在可以来看看map函数与flatMap函数之间的区别。
scala> listInt.map(x=> x match {
case 1 => List(1)
case _ => List(x*2,x*3,x*4)
})
res6: List[List[Int]] =List(List(1), List(4, 6, 8), List(6, 9, 12))
scala>listInt.flatMap(x => x match {
case 1 => List(1)
case _ => List(x*2,x*3,x*4)
})
res7: List[Int] =List(1, 4, 6, 8, 6, 9, 12)
对于Array等其他集合类型的flatMap函数,其作用原理是类似的,这里不再一一赘述。
(3)filter函数
定义:def filter(p:(T) ⇒Boolean): Array[T]
用途:返回所有满足条件p的元素集合。
scala> vallistInt=List(1, 4, 6, 8, 6, 9, 12)
listInt: List[Int] =List(1, 4, 6, 8, 6, 9, 12)
//返回所有元素值大于6的元素构成的集合
scala>listInt.filter(x=>x>6)
res8: List[Int] = List(8,9, 12)
//简化的写法
scala>listInt.filter(_>6)
res9: List[Int] = List(8,9, 12)
Array等类型的集合中的filter方法使用也类似,这里不再一一赘述。
(4)reduce函数
定义:def reduce[A1>: A](op: (A1, A1) ⇒ A1): A1
用途:使用函数op作用于集合之上,返回的结果类型为A1。op为特定的联合二元算子(associative binary operator),A1为A的超类。
//reduce函数作用演示
scala>Array(1,2,4,3,5).reduce((x:Int,y:Int)=>{println(x,y);x+y})
(1,2)
(3,4)
(7,3)
(10,5)
res60: Int = 15
//简化的写法
scala>Array(1,2,4,3,5).reduce(_+_)
res61: Int = 15
reduce函数还有两个函数变种,分别是reduceLeft和reduceRight,reduceLeft函数指的是op函数按集合中元素的顺序从左到右对其进行reduce操作,而reduceRight函数作用顺序则相反。
//reduceLeft函数作用演示
scala>Array(1,2,4,3,5).reduceLeft((x:Int,y:Int)=>{println(x,y);x+y})
(1,2)
(3,4)
(7,3)
(10,5)
res61: Int = 15
//reduceRight函数作用演示
scala>Array(1,2,4,3,5).reduceRight((x:Int,y:Int)=>{println(x,y);x+y})
(3,5)
(4,8)
(2,12)
(1,14)
res62: Int = 15
(5)fold函数
定义:def fold[A1>: A](z: A1)(op: (A1, A1) ⇒ A1): A1
用途:使用联合二元操作算子对集合进行fold操作。Z为给定的初始值。
//fold函数执行过程演示
scala> Array(1,2,4,3,5).fold(0)((x:Int,y:Int)=>{println(x,y);x+y})
(0,1)
(1,2)
(3,4)
(7,3)
(10,5)
res10: Int = 15
//简化的写法
scala> Array(1,2,4,3,5).fold(0)(_+_)
res13: Int = 15
fold函数也有两种函数变种:foldLeft与foldRight函数,foldLeft按从左到右的顺序进行fold操作,而foldRight则相反。
scala>Array(1,2,4,3,5).foldRight(0)((x:Int,y:Int)=>{println(x,y);x+y})
(5,0)
(3,5)
(4,8)
(2,12)
(1,14)
res11: Int = 15
scala>Array(1,2,4,3,5).foldLeft(0)((x:Int,y:Int)=>{println(x,y);x+y})
(0,1)
(1,2)
(3,4)
(7,3)
(10,5)
res12: Int = 15




