博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
大数据笔记(二十五)——Scala函数式编程
阅读量:4325 次
发布时间:2019-06-06

本文共 3194 字,大约阅读时间需要 10 分钟。

===================== Scala函数式编程 ========================

一、Scala中的函数

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

def myFunc1(name:String):String = "Hello " + nameprintln(myFunc1("Tom"))def myFunc2():String = "Hello World"//值函数:把函数作为变量的值val v1 = myFunc1("Tom")val v2 = myFunc2()//再将v1付给myFunc1println(myFunc1(v1))

 

运行:

myFunc1: myFunc1[](val name: String) => StringHello Tomres0: Unit = ()myFunc2: myFunc2[]() => Stringv1: String = Hello Tomv2: String = Hello WorldHello Hello Tomres1: Unit = ()

 

二、匿名函数:没有名字的函数

//匿名函数:没有名字的函数// 完整: def myFunc3(x:Int) = x * 3(x:Int) => x*3//举例:Array(1,2,3) ====> (3,6,9)Array(1,2,3).map((x:Int) => x*3)

 

运行:

res2: Int => Int = 
res3: Array[Int] = Array(3, 6, 9)

 

三、高阶函数:带函数参数的函数

注意:把一个函数作为另外一个函数的参数值

四、高阶函数示例

//高阶函数import scala.math._//对数字10进行某种运算//f : 就是执行的运算def someAction(f:(Double)=>Double) = f(10)//测试//情况1:开平方someAction(sqrt)someAction(sin)//另一个例子def mytest(x:Int,y:Int):Int = { x*y + 10}//定义一个高阶函数def myFunction(f:(Int,Int)=>Int,x:Int,y:Int)=f(x,y)//调用myFunction(mytest,2,3)

 

 

运行:

import scala.math._someAction: someAction[](val f: Double => Double) => Doubleres0: Double = 3.1622776601683795res1: Double = -0.5440211108893698mytest: mytest[](val x: Int,val y: Int) => IntmyFunction: myFunction[](val f: (Int, Int) => Int,val x: Int,val y: Int) => Intres2: Int = 16

 

数据: 

val numbers = List(1,2,3,4,5,6,7,8,9,10)

 

map: 作用于列表中的每个元素,并且返回一个新的列表

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

foreach: 跟map一样,没有返回值

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

filter: 移除函数函数false的元素
返回所有能够被2整除的元素

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

zip: 把两个列表合并到一个列表中

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

数据: 

val numbers = List(1,2,3,4,5,6,7,8,9,10)

partition: 能被2整除的放到一个分区中,不能被整除的放到另一个分区中

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

find: 第一个匹配条件的元素

找到第一个能被3整除的元素

numbers.find((x:Int) => x%3 == 0)numbers.find(_ % 3 == 0)

flatten: 把一个嵌套的结构展开

List(List(1,2,3),List(4,5,6)).flatten

flatMap: 压平,结合了map和flatten的功能

var myList = List(List(1,2,3),List(4,5,6))myList.flatMap(x=>x.map(_ *2))

分为两步

1、List(1,2,3),List(4,5,6) ===> 合并成一个List
2、再乘以2

运行以上例子的结果:

numbers: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)res0: List[Int] = List(2, 4, 6, 8, 10, 12, 14, 16, 18, 20)res1: Unit = ()res2: List[Int] = List(2, 4, 6, 8, 10)res3: List[(Int, Int)] = List((1,4), (2,5), (3,6))res4: (List[Int], List[Int]) = (List(2, 4, 6, 8, 10),List(1, 3, 5, 7, 9))res5: Option[Int] = Some(3)res6: Option[Int] = Some(3)res7: List[Int] = List(1, 2, 3, 4, 5, 6)myList: List[List[Int]] = List(List(1, 2, 3), List(4, 5, 6))res8: List[Int] = List(2, 4, 6, 8, 10, 12)score: scala.collection.mutable.Map[String,Int] = Map(Mike -> 90)res9: Unit = ()Map(Mike -> 85)res10: Unit = ()

 

五、闭包: 就是函数的嵌套

在一个函数定义中,包含了另一个函数的定义;在内函数中可以访问外函数中的变量
定义函数:乘法运算

def myfunc(x:Int,y:Int) = x * y

采用闭包

def mulBy(factor:Double)=(x:Double)=> x * factor

第一个参数:factor 乘法因子,乘以的倍数
第二个参数:(x:Double)匿名函数,接收一个double数据变量
测试:
乘以3倍

val triple = mulBy(3) //3代表乘法因子

 

 ---> triple是值函数,接收一个参数(x)

triple(10) //10就是x,结果30triple(6)  //18

除以2的操作

val half = mulBy(0.5)half(10)  //5

 

六、柯里化:Currying
柯里化函数:把具有多个参数的函数转换成一个函数链,每个节点上的都是一个单一参数的函数
举例:
以下两个函数是等价

def add(x:Int,y:Int)= x + ydef add(x:Int)(y:Int) = x + y ===> Scala柯里化的语法 

转载于:https://www.cnblogs.com/lingluo2017/p/8678750.html

你可能感兴趣的文章
阶段3 3.SpringMVC·_05.文件上传_1 文件上传之上传原理分析和搭建环境
查看>>
阶段3 3.SpringMVC·_05.文件上传_4 文件上传之Springmvc方式上传代码
查看>>
阶段3 3.SpringMVC·_05.文件上传_3 文件上传之Springmvc方式上传原理分析
查看>>
阶段3 3.SpringMVC·_05.文件上传_6 文件上传之跨服务器上传代码
查看>>
阶段3 3.SpringMVC·_05.文件上传_5 文件上传之跨服务器上传分析和搭建环境
查看>>
阶段3 3.SpringMVC·_06.异常处理及拦截器_1 SpringMVC异常处理之分析和搭建环境
查看>>
阶段3 3.SpringMVC·_06.异常处理及拦截器_4 SpringMVC拦截器之介绍和搭建环境
查看>>
阶段3 3.SpringMVC·_06.异常处理及拦截器_6 SpringMVC拦截器之拦截器入门代码
查看>>
阶段3 3.SpringMVC·_06.异常处理及拦截器_2 SpringMVC异常处理之演示程序异常
查看>>
阶段3 3.SpringMVC·_07.SSM整合案例_01.ssm整合说明
查看>>
阶段3 3.SpringMVC·_06.异常处理及拦截器_3 SpringMVC异常处理之异常处理代码编写
查看>>
阶段3 3.SpringMVC·_07.SSM整合案例_03ssm整合之编写Spring框架
查看>>
阶段3 3.SpringMVC·_06.异常处理及拦截器_5 SpringMVC拦截器之编写controller
查看>>
阶段3 3.SpringMVC·_07.SSM整合案例_05.ssm整合之Spring整合SpringMVC的框架
查看>>
阶段3 3.SpringMVC·_07.SSM整合案例_06.ssm整合之编写MyBatis框架
查看>>
阶段3 3.SpringMVC·_07.SSM整合案例_07.ssm整合之编写MyBatis框架测试保存的方法
查看>>
阶段3 3.SpringMVC·_06.异常处理及拦截器_7 SpringMVC拦截器之拦截器接口方法演示
查看>>
阶段3 3.SpringMVC·_07.SSM整合案例_09.ssm整合之Spring整合MyBatis框架配置事务
查看>>
阶段3 3.SpringMVC·_07.SSM整合案例_02.ssm整合之搭建环境
查看>>
小D课堂 - 零基础入门SpringBoot2.X到实战_第1节零基础快速入门SpringBoot2.0_3、快速创建SpringBoot应用之手工创建web应用...
查看>>