本节主要内容
(一)函数字面量(值函数)

(二)匿名函数

(三)函数的简化

(四)函数参数

(四)闭包

函数字面量(值函数)
函数字面量(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入门到精通——第五节 函数与闭包相关推荐

  1. Scala入门到精通——第五节 函数、高阶函数与闭包

    本节主要内容 (一)函数字面量(值函数) (二)匿名函数 (三)函数的简化 (四)函数参数 (四)闭包 函数字面量(值函数) 函数字面量(function literal),也称值函数(functio ...

  2. Excel数据分析从入门到精通(五)函数进阶-52个Excel函数之逻辑类函数

    Excel数据分析从入门到精通(五)函数进阶-52个Excel函数之逻辑类函数 1.逻辑类函数-if 函数含义 函数使用 2.逻辑类函数-AND 函数含义 函数使用 3.逻辑类函数-OR 函数含义 函 ...

  3. Scala入门到精通——第二十一节 类型参数(三)-协变与逆变

    本节主要内容 协变 逆变 类型通匹符 1. 协变 协变定义形式如:trait List[+T] {} .当类型S是类型A的子类型时,则List[S]也可以认为是List[A}的子类型,即List[S] ...

  4. Scala入门到精通——第二十节 类型参数(二)

    本节主要内容 Ordering与Ordered特质 上下文界定(Context Bound) 多重界定 类型约束 1. Ordering与Ordered特质 在介绍上下文界定之前,我们对Scala中的 ...

  5. Scala入门到精通——第十节 Scala类层次结构、Traits初步

    本节主要内容 Scala类层次结构总览 Scala中原生类型的实现方式解析 Nothing.Null类型解析 Traits简介 Traits几种不同使用方式 1 Scala类层次结构 Scala中的类 ...

  6. Scala入门到精通——第六节:类和对象(一)

    本节主要内容 1 类定义.创建对象 2 主构造器 3 辅助构造器 类定义.创建对象 //采用关键字class定义 class Person {//类成员必须初始化,否则会报错//这里定义的是一个公有成 ...

  7. Scala入门到精通——第二十七节 Scala操纵XML

    本节主要内容 XML 字面量 XML内容提取 XML对象序列化及反序列化 XML文件读取与保存 XML模式匹配 1. XML 字面量 XML是一种非常重要的半结构化数据表示方式,目前大量的应用依赖于X ...

  8. Scala入门到精通——第十七节 类型参数(一)

    本节主要内容 类型变量界定(Type Variable Bound) 视图界定(View Bound) 上界(Upper Bound)与下界(Lower Bound) 1. 类型变量界定(Type V ...

  9. Scala入门到精通——第十一节 Trait进阶

    本节主要内容 trait构造顺序 trait与类的比较 提前定义与懒加载 trait扩展类 self type 1 trait构造顺序 在前一讲当中我们提到,对于不存在具体实现及字段的trait,它最 ...

最新文章

  1. 《http权威指南》读书笔记 二
  2. linux学习-防火墙
  3. DWZ(JUI)的lookupGroup增加回调函数
  4. 【共读Primer】55.[6.4]函数重载--重载与作用域 Page210
  5. HTML+CSS+JS实现 ❤️爱心文字3D旋转动画特效❤️
  6. apache开启虚拟主机localhost无法访问
  7. Flex和Flash开发人员的Adobe Flash Player( Windows )调试器( 也称为调试播放器或内容调试器 )和独立播放器( 又名投影仪 )
  8. 《数据结构》线性表——链式存储结构
  9. 大型体检系统源码,PEIS医院体检管理系统源码
  10. ASP.NET MVC中商品模块小样
  11. Netty学习1——Netty的核心组件
  12. 【Unity学习笔记】——基础篇:关于光照GI
  13. MyBatis之动态SQL
  14. 什么,BOM指的是物料清单?
  15. Docker Swarm浅尝辄止
  16. Win10日语输入法切换快捷键
  17. 统计学基础——两个样本均值(频率)之差的分布
  18. 【JavaScript 逆向】猿人学 web 第五题:乱码增强
  19. 三星应用商店服务器,更多App体验和三星应用商店总结
  20. codeforces1469D. Ceil Divisions

热门文章

  1. iPhone 12 Pro Max机模曝光:有乔布斯内味儿了
  2. 哈啰单车突发网络故障 网友上班迟到狂吐槽
  3. 智能快递柜10月1日起按新规管理
  4. 从淘宝CFO到接棒马云 张勇是如何在12年里成为阿里董事局主席的
  5. 5G套餐最低190元 专家:用不起就别用
  6. OPPO Reno造乐节落地重庆 华语乐坛十大金曲榜单公布
  7. 华为海思总裁致信员工:多年备胎一夜转正 挽狂澜于既倒
  8. 高中生用付款截图吃霸王餐近一年 网友:支付宝进来推销
  9. 三星上线售价99万8K电视 网友:是不是多打了一位数
  10. 36岁程序员:领导平时称兄道弟,裁员时立刻变脸,看透人性