Scala-函数式编程

目录
    1.Scala中的函数
    2.匿名函数:没有名字的函数
    3.带函数参数的函数,即:高阶函数
    4.高阶函数示例
    5.闭包
    6.柯里化:Currying

1.Scala中的函数

    在Scala中,函数是“头等公民”,就和数字一样。可以在变量中存放函数,即:将函数作为变量的值(值函数)

举例:使用Spark来执行WordCount

var result = sc.textFile("hdfs://....").flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_).collect
2.匿名函数:没有名字的函数
//普通函数
def fun1(x:Int):Int = x*3

//匿名函数
(x:Int)=>x*3

注:匿名函数:一个普通的函数,把返回值去掉,再把函数名和“def”去掉,再在"="后面的加一个">"

调用匿名函数作为函数参数

3.带函数参数的函数,即:高阶函数

(1)示例1:
(a)首先,定义一个最普通的函数

(b)再定义一个高阶函数

(c)分析这个高阶函数调用的过程

(2)示例2:

    在这个例子中,首先定义了一个普通的函数mytest,然后定义了一个高阶函数myFunction;myFunction接收三个参数:第一个f是一个函数参数,第二个是x,第三个是y。而f是一个函数参数,本身接收两个Int的参数,返回一个Int的值。

4.高阶函数示例

(1)map:相当于一个循环,对某个集合中的每个元素进行操作(接收一个函数),返回一个新的集合

//map
//在列表中的每个元素上计算一个函数,并且返回一个包含相同数目元素的列表
val numbers = List(1,2,3,4,5,6,7,8,9,10)

numbers.map((i:Int)=>i*2)

numbers.map(_*2)

//map函数不改变numbers值
numbers
_ 相当于循环变量 i
_*2 与 (i:Int)=>i*2 功能相同
_+_ 与 (i:Int,j:Int)=>i+j

(2)foreach:相当于一个循环,对某个集合中的每个元素进行操作(接收一个函数),不返回结果。

//foreach
//foreach和map相似,只不过它没有返回值,foreach主要是为了对参数进行作用
numbers.foreach((i:Int) => i * 2)

numbers.foreach(_*2)

numbers

numbers.foreach(println(_))

numbers.map(_*2).foreach(println)

(3)filter:过滤,选择满足的数据

举例:查询能够被2整除的数字

//filter
//移除任何使得传入的函数返回false的元素

numbers.filter((i:Int) =>i%2==0)

说明:(i:Int)=>i%2==0 如果是true 就返回

(4)zip:合并两个集合

//zip
//zip把两个列表的原色合成一个由元素对组成的列表
List(1,2,3).zip(List(4,5,6))

List(1,2,3).zip(List(4,5))

List(3).zip(List(4,5))

(5)partition:根据断言(就是某个条件,可以通过一个匿名函数来实现)的结果,进行分区

举例:把能够被2整除的分成一个区,不能整除的分成另一个区

//partition
//partition根据断言函数的返回值对列表进行拆分
numbers.partition((i:Int)=>i%2==0)

在这个例子中,可以被2整除的被分到一个分区;不能被2整除的被分到另一个分区。

(6)find:查找第一个满足条件(断言)的元素

//find
//find返回集合里第一个匹配断言函数的元素
numbers.find(_ % 3==0)

(7)flatten:把嵌套的结果展开,合并成为一个集合

//flatten
//flatten可以把嵌套的结构展开
List(List(1,2,3),List(4,5,6)).flatten

(8)flatmap:相当于map+flatten

//flatMap
//flatMap是一个常用的combinator,它结合了map和flatten的功能
val myList = List(List(2,4,6,8,10),List(1,3,5,7,9))

myList.flatMap(x=>x.map(_*2))

执行过程:

1.将List(2,4,6,8,10)和List(1,3,5,7,9)调用了x=>x.map(_*2)  这里x代表某个List
List(4, 8, 12, 16, 20)  和 List(2, 6, 10, 14, 18)

2.合并成一个List
List(4, 8, 12, 16, 20, 2, 6, 10, 14, 18)
5.闭包

    就是函数的嵌套,即:在一个函数定义中,包含另外一个函数的定义;并且在内函数中可以访问外函数中的变量

测试上面的函数:

6.柯里化:Currying

    柯里化函数(Curried Function)是把具有多个参数的函数转换为一条函数链,每个节点上是单一参数。

一个简单的例子:

你可能感兴趣的:(Scala-函数式编程)