Scala入门到精通——第五节 函数与闭包
本节主要内容
(一)函数字面量(值函数)
(二)匿名函数
(三)函数的简化
(四)函数参数
(四)闭包
函数字面量(值函数)
函数字面量(function literal),也称值函数(function values),指的是函数可以赋值给变量。
一般函数具有如下形式:
而函数字面量具有如下形式:
/*函数字面量 function literal=>左侧的表示输入,右侧表示转换操作相当于val incresae(x:Int){return x + 1 ;}
*/
scala> val increase=(x:Int)=>x+1
increase: Int => Int = <function1>scala> println(increase(10))
11
//前面的语句等同于
scala> def increaseAnother(x:Int)=x+1
increaseAnother: (x: Int)Intscala> println(increaseAnother(10))
11//多个语句则使用{}
val increase2=(x:Int)=>{println("Xue")println("Tu")println("Wu")println("You")x+1
}
scala>println(increase2(10))
Xue
Tu
Wu
You
11//数组的map方法中调用(写法1)
scala> println(Array(1,2,3,4).map(increase).mkString(","))
2,3,4,5
匿名函数
//匿名函数写法(写法2)
scala>println(Array(1,2,3,4).map((x:Int)=>x+1).mkString(","))
2,3,4,5
函数进一步简化
//花括方式(写法3)
scala> Array(1,2,3,4).map{(x:Int)=>x+1}.mkString(",")
res25: String = 2,3,4,5//省略.的方式(写法4)
scala> Array(1,2,3,4) map{(x:Int)=>x+1} mkString(",")
res26: String = 2,3,4,5//参数类型推断写法(写法5)
scala> Array(1,2,3,4) map{(x)=>x+1} mkString(",")
res27: String = 2,3,4,5//函数只有一个参数的话,可以省略()(写法6)
scala> Array(1,2,3,4) map{x=>x+1} mkString(",")
res28: String = 2,3,4,5//如果参数右边只出现一次,则可以进一步简化(写法7)
scala> Array(1,2,3,4) map{_+1} mkString(",")
res29: String = 2,3,4,5//值函数简化方式//val fun0=1+_,该定义方式不合法,因为无法进行类型推断
scala> val fun0=1+_
<console>:10: error: missing parameter type for expanded function ((x$1) => 1
x$1))//值函数简化方式(正确方式)
scala> val fun1=1+(_:Double)
un1: Double => Double = <function1>scala> fun1(999)
es30: Double = 1000.0//值函数简化方式(正确方式2)
scala> val fun2:(Double)=>Double=1+_
fun2: Double => Double = <function1>scala> fun2(200)
res31: Double = 201.0
函数参数
//函数参数(高阶函数)
//((Int)=>String)=>String
scala> def convertIntToString(f:(Int)=>String)=f(4)
convertIntToString: (f: Int => String)Stringscala> convertIntToString((x:Int)=>x+" s")
res32: String = 4 s//高阶函数可以产生新的函数
//(Double)=>((Double)=>Double)
scala> def multiplyBy(factor:Double)=(x:Double)=>factor*x
multiplyBy: (factor: Double)Double => Doublescala> val x=multiplyBy(10)
x: Double => Double = <function1>scala> x(50)
res33: Double = 500.0
函数闭包
//闭包(Closure)//(x:Int)=>x+more,这里面的more是一个自由变量(Free Variable),more是一个没有给定含义的不定变量
//而x则的类型确定、值在函数调用的时候被赋值,称这种变量为绑定变量(Bound Variable)
scala> (x:Int)=>x+more
<console>:8: error: not found: value more(x:Int)=>x+more^
scala> var more=1
more: Int = 1scala>val fun=(x:Int)=>x+more
fun: Int => Int = <function1>scala> fun(10)
res1: Int = 11scala> more=10
more: Int = 10scala> fun(10)
res2: Int = 20//像这种运行时确定more类型及值的函数称为闭包,more是个自由变量,在运行时其值和类型得以确定//这是一个由开放(free)到封闭的过程,因此称为闭包scala> val someNumbers = List(-11, -10, -5, 0, 5, 10)
someNumbers: List[Int] = List(-11, -10, -5, 0, 5, 10)scala> var sum = 0
sum: Int = 0scala> someNumbers.foreach(sum += _)scala> sum
res8: Int = -11scala> someNumbers.foreach(sum += _)scala> sum
res10: Int = -22//下列函数也是一种闭包,因为在运行时其值才得以确定
def multiplyBy(factor:Double)=(x:Double)=>factor*x
Scala入门到精通——第五节 函数与闭包相关推荐
- Scala入门到精通——第五节 函数、高阶函数与闭包
本节主要内容 (一)函数字面量(值函数) (二)匿名函数 (三)函数的简化 (四)函数参数 (四)闭包 函数字面量(值函数) 函数字面量(function literal),也称值函数(functio ...
- Excel数据分析从入门到精通(五)函数进阶-52个Excel函数之逻辑类函数
Excel数据分析从入门到精通(五)函数进阶-52个Excel函数之逻辑类函数 1.逻辑类函数-if 函数含义 函数使用 2.逻辑类函数-AND 函数含义 函数使用 3.逻辑类函数-OR 函数含义 函 ...
- Scala入门到精通——第二十一节 类型参数(三)-协变与逆变
本节主要内容 协变 逆变 类型通匹符 1. 协变 协变定义形式如:trait List[+T] {} .当类型S是类型A的子类型时,则List[S]也可以认为是List[A}的子类型,即List[S] ...
- Scala入门到精通——第二十节 类型参数(二)
本节主要内容 Ordering与Ordered特质 上下文界定(Context Bound) 多重界定 类型约束 1. Ordering与Ordered特质 在介绍上下文界定之前,我们对Scala中的 ...
- Scala入门到精通——第十节 Scala类层次结构、Traits初步
本节主要内容 Scala类层次结构总览 Scala中原生类型的实现方式解析 Nothing.Null类型解析 Traits简介 Traits几种不同使用方式 1 Scala类层次结构 Scala中的类 ...
- Scala入门到精通——第六节:类和对象(一)
本节主要内容 1 类定义.创建对象 2 主构造器 3 辅助构造器 类定义.创建对象 //采用关键字class定义 class Person {//类成员必须初始化,否则会报错//这里定义的是一个公有成 ...
- Scala入门到精通——第二十七节 Scala操纵XML
本节主要内容 XML 字面量 XML内容提取 XML对象序列化及反序列化 XML文件读取与保存 XML模式匹配 1. XML 字面量 XML是一种非常重要的半结构化数据表示方式,目前大量的应用依赖于X ...
- Scala入门到精通——第十七节 类型参数(一)
本节主要内容 类型变量界定(Type Variable Bound) 视图界定(View Bound) 上界(Upper Bound)与下界(Lower Bound) 1. 类型变量界定(Type V ...
- Scala入门到精通——第十一节 Trait进阶
本节主要内容 trait构造顺序 trait与类的比较 提前定义与懒加载 trait扩展类 self type 1 trait构造顺序 在前一讲当中我们提到,对于不存在具体实现及字段的trait,它最 ...
最新文章
- 《http权威指南》读书笔记 二
- linux学习-防火墙
- DWZ(JUI)的lookupGroup增加回调函数
- 【共读Primer】55.[6.4]函数重载--重载与作用域 Page210
- HTML+CSS+JS实现 ❤️爱心文字3D旋转动画特效❤️
- apache开启虚拟主机localhost无法访问
- Flex和Flash开发人员的Adobe Flash Player( Windows )调试器( 也称为调试播放器或内容调试器 )和独立播放器( 又名投影仪 )
- 《数据结构》线性表——链式存储结构
- 大型体检系统源码,PEIS医院体检管理系统源码
- ASP.NET MVC中商品模块小样
- Netty学习1——Netty的核心组件
- 【Unity学习笔记】——基础篇:关于光照GI
- MyBatis之动态SQL
- 什么,BOM指的是物料清单?
- Docker Swarm浅尝辄止
- Win10日语输入法切换快捷键
- 统计学基础——两个样本均值(频率)之差的分布
- 【JavaScript 逆向】猿人学 web 第五题:乱码增强
- 三星应用商店服务器,更多App体验和三星应用商店总结
- codeforces1469D. Ceil Divisions