暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Scala函数式编程(五)——高阶函数的使用

Scala学习 2016-06-03
563

通过上一小节,我们已经很清楚高阶函数的定义及使用方法了。本节将对Scala集合中常用的高阶函数进行介绍。

1map函数

定义: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)

 

    

2flatmap函数

定义: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函数,其作用原理是类似的,这里不再一一赘述。

3filter函数

定义: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方法使用也类似,这里不再一一赘述。

4reduce函数

定义:def reduce[A1>: A](op: (A1, A1) ⇒ A1): A1

用途:使用函数op作用于集合之上,返回的结果类型为A1op为特定的联合二元算子(associative binary operator),A1A的超类。

//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函数还有两个函数变种,分别是reduceLeftreduceRightreduceLeft函数指的是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

 

5fold函数

定义: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函数也有两种函数变种:foldLeftfoldRight函数,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


文章转载自Scala学习,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论