本节主要内容

(一)函数字面量(值函数)

(二)匿名函数

(三)函数的简化

(四)函数参数

(四)闭包

函数字面量(值函数)

函数字面量(function literal),也称值函数(function values),指的是函数可以赋值给变量。

一般函数具有如下形式:

而函数字面量具有如下形式:

/*函数字面量 function literal=>左侧的表示输入,右侧表示转换操作
*/
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. 第 3 节 JavaScript高阶函数的使用、v-model、组件化

    第3节 JavaScript高阶函数的使用.v-model.组件化 JavaScript 高阶函数的使用 v-model v-model的使用和原理 v-model 结合 radio 类型使用 v-m ...

  3. Clickhouse 数组函数 高阶函数

    数组函数的概述: Clickhouse> select version();SELECT version()┌─version()───┐ │ 20.8.1.4447 │ └────────── ...

  4. 偏函数 匿名函数 高阶函数 map filter reduce

    # 偏函数 创建一个新的函数,指定我们要使用的函数的某个参数为固定的值,这个新函数就是偏函数 def test(a, b, c, d=1):print(a + b + c + d)from funct ...

  5. Kotlin学习笔记 第三章 函数 高阶函数 lambda表达式 内联函数

    参考链接 Kotlin官方文档 https://kotlinlang.org/docs/home.html 中文网站 https://www.kotlincn.net/docs/reference/p ...

  6. Python基础-函数,高阶函数

    Python基础-函数 1.函数的定义和函数的执行流程: """ 函数学习 """print('程序开始') a = 10 # 在内存中申请 ...

  7. 廖雪峰讲python高阶函数-高阶函数

    高阶函数英文叫Higher-order function.什么是高阶函数?我们以实际代码为例子,一步一步深入概念. 变量可以指向函数 以Python内置的求绝对值的函数abs()为例,调用该函数用以下 ...

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

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

  9. python匿名函数里用if_python匿名函数 高阶函数 内置函数 文件操作

    1.匿名函数 匿名就是没有名字 def func(x,y,z=1): return x+y+z 匿名 lambda x,y,z=1:x+y+z #与函数有相同的作用域,但是匿名意味着引用计数为0,使用 ...

最新文章

  1. 如何判断Android手机当前是否联网
  2. java 线程的几种状态(转载)
  3. 计算机与现代化投稿流程,计算机与现代化投稿须知
  4. goldengate版本升级( from v10.4 to v11.1.1.1.0.29)
  5. python自动化框架测试实操_自动化框架之 python+selenium+pytest
  6. 如何迅速掌握并提高linux运维技能
  7. Java学习系列(十二)Java面向对象之序列化机制及版本
  8. Linux下的帮助命令
  9. UE4 C++头文件
  10. 微信小程序接入海康威视萤石云直播
  11. cf黑机器多久解除_[CF]黑机器码过无限提示一分钟强制踢出游戏的方法
  12. Linux虚拟机克隆后网络冲突解决办法
  13. php session fixation,聊聊session fixation attacks
  14. 解决:Unknown column ‘id‘ in ‘where clause‘ 问题
  15. NPDP产品经理小知识-质量功能展开和质量屋
  16. 做人温和一点,做事狠一点。
  17. 关于「微信小程序」背后的故事
  18. MySQL——10038错误
  19. c++课程设计日历记事本
  20. vbs 叫爸爸恶搞代码

热门文章

  1. [leetcode] 230.二叉搜索树中的最小树
  2. redo日志写入为什么“俩阶段提交”
  3. flutter 动画json_Flutter 50: 图解动画小插曲之 Lottie 动画
  4. linux给文件赋权限找不到,linux 文件赋权限
  5. python的out模式_如何用python中的DataFrame列的模式替换NA值?
  6. python mysql library popular_python之mysql入门详解(四)
  7. 缩进一个字符_Indesign里标点挤压及首行缩进2字符设置
  8. python条形图颜色设置_python – 根据值在matplotlib中更改3D条形图中的条形颜色
  9. 湖北大学计算机学院胡院长,学院召开新一届领导干部任命宣布大会
  10. java mvc mvp mvvm_一篇文章了解架构模式:MVC/MVP/MVVM