Scala 基础(7)—— 函数字面量和一等函数
1. 函数字面量
在 Scala 基础(3)—— 基础类型和基础操作 中提到了函数字面量,这里具体解释函数字面量的语法。
下面展示一个具体的函数字面量,它由三部分组成:
(x: Int, y: Int) => x + y
- 圆括号内部的参数列表
- 右箭头
- 函数体
2. 一等函数
一等函数可以说是 Scala 中非常重要的特性。
所谓一等函数,就是使用函数字面量,将其作为值进行传递。
函数字面量会被编译成类,并且在运行时实例化成函数值,做一个简单的类比:
- 函数字面量 -> 类
- 函数值 -> 对象
一等函数在 Scala 的代码中被广泛的应用,例如集成在集合类中的 foreach 和 filter 方法。
foreach 被用来遍历集合,相比于 for 表达式,这是一种更加偏向于函数式表达的语法:
def main(args: Array[String]): Unit = {
val list = List(1, 2, 3)
list.foreach((x: Int) => println(x))
}
foreach 方法的入参就是一个函数字面量,其类型是 Int => Unit
filter 被用来筛选出集合中满足指定条件的元素:
def main(args: Array[String]): Unit = {
val list = List(1, 2, 3)
list.filter((x: Int) => x > 0)
}
filter 方法的参数类型是 Int => Boolean
3. 简写函数字面量
在上述 filter 的例子中,函数字面量的写法其实可以进一步优化。
list.filter((x: Int) => x > 0)
首先,编译器知道 x 必定是整数,因为这是一个过滤一个由整数组成的列表。我们称 Int 为目标类型(target typing)。
因此,可以依靠类型推断来略去参数类型的声明:
list.filter((x) => x > 0)
其次,这个类型推断参数两侧的括号也可以省去:
list.filter(x => x > 0)
Scala 基础(7)—— 函数字面量和一等函数的更多相关文章
- Scala函数字面量简化写法
Scala提供了多种方法来简化函数字面量中多余的部分,比如前面例子中filter方法中使用的函数字面量,完整的写法如下: (x :Int ) => x +1 首先可以省略到参数的类型,Scala ...
- Scala函数字面量
Scala中函数为头等公民,你不仅可以定义一个函数然后调用它,而且你可以写一个未命名的函数字面量,然后可以把它当成一个值传递到其它函数或是赋值给其它变量.下面的例子为一个简单的函数字面量(参考整数字面 ...
- js拾遗: 函数字面量
今天落叶同学发我一篇文章,我看到一个"新"名词 "函数字面量" (也可叫直接量),当时我就郁闷了,这是什么东西? 我怎么没听说过..回头翻了下权威指南,在第 4 ...
- js基础知识:字面量 关键字和保留字
js中的字面量概念我的理解就是:字体表面的常量 如:数字 100, 字符串 "ssss"或'ssss' 布尔值:false ,正则 以及null对象. 这些都是常量. 关键字: ...
- JS基础_对象字面量
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- 【C#基础概念】字面量 literal
一.字面量定义 在计算机科学中,字面量(literal)是用于表达源代码中一个固定值的表示法(notation).几乎所有计算机编程语言都具有对基本值的字面量表示,诸如:整数.浮点数以及字符串:而有很 ...
- 《流畅的Python》第三部分 把函数视作对象 【一等函数】【使用一等函数实现设计模式】【函数装饰器和闭包】
第三部分 第5章 一等函数 一等对象 在运行时创建 能赋值给变量或数据结构中的元素 能作为参数传递给函数 能作为函数的返回结果 在Python中,所有函数都是一等对象 函数是对象 函数本身是 func ...
- scala基础语法(变量,数据类型,函数)
一:常量与变量 1.常量 2.两种变量定义方式(严格与不严格) 3.Float注意点 3.注意点 变量名后加上: 类型首字母是大写 4.占位符_ 但是需要制定类型 5.scala数据类型 6.其他类型 ...
- Scala 基础(1)—— 定义变量 & 定义函数
1. 使用 val & var 定义变量 Scala 中的变量被分为2种:val 和 var.其含义于 Java 中的 final 关键字类似. val 等同于被 final 修饰过的变量, ...
随机推荐
- 泛型&&枚举
1.枚举类型 JDk1.5中新增了枚举类型,可以使用该功能取代以往定义常量的方式,同时枚举类型还赋予程序在编译时进行检查的功能. 1.1 使用枚举类型设置常量 以往设置常量,通常将常量放在接口中(fi ...
- iOS 多线程 之 GCD(大中枢派发)(二)
本文接着上一篇讲.主要讲:dispatch_source. dispatch_source主要用户监听事件,可以监听如下事件 DISPATCH_SOURCE_TYPE_DATA_ADD DISPATC ...
- WPF与Silverlight对比
1.WPF中控件的肤色可以直接:telerik:StyleManager.Theme=”XXXXX”,不用再导入肤色的dll包.可Silverlight使用系统肤色时,要导入肤色的dll包. WPF引 ...
- POJ2154 Color(Polya定理)
Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 11654 Accepted: 3756 Description Bead ...
- MySQL中事物的详解
1. 事物的定义及特性 事务是一组操作数据库的SQL语句组成的工作单元,该工作单元中所有操作要么同时成功,要么同时失败.事物有如下四个特性,ACID简称“酸性”. 1)原子性:工作单元中所有的操作要么 ...
- pip命令小结
pip的另一种调用方式 python -m pip通过指定python的名字来指定特定的pip pip freeze > 项目目录/requirements.txt导出pip中下载的包目录 pi ...
- 对Neural Machine Translation by Jointly Learning to Align and Translate论文的详解
读论文 Neural Machine Translation by Jointly Learning to Align and Translate 这个论文是在NLP中第一个使用attention机制 ...
- python创建字典
创建: {x:x**2 for x in (2,4,6)} dict(xjm=110,lxh=119,pzq=120) dict([('a',1),('b',2),('c',3)])
- [Hdu1166]敌兵布阵(CQD分治)
CQQ分治 Code #include <cstdio> #include <cstring> #define N 50010 struct info{ int x,p,v; ...
- [Codeforces967C]Stairs and Elevators(二分查找)
[不稳定的传送门] Sloution 每次试一下最近的2个楼梯或者电梯就行了 Code #include <cstdio> #include <algorithm> #incl ...