Scala 您所在的位置:网站首页 scala函数式编程实例 Scala

Scala

2023-09-16 12:28| 来源: 网络整理| 查看: 265

目录     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)是把具有多个参数的函数转换为一条函数链,每个节点上是单一参数。

一个简单的例子:



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有