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 修饰过的变量, ...
随机推荐
- ipython notebook超级好用
这个东西超级好用,以后要以c++和python为主要沟通语言了.
- 前端css盒模型及标准文档流及浮动问题
1.盒模型 "box model"这一术语是用来设计和布局时使用,然后在网页中基本上都会显示一些方方正正的盒子.我们称为这种盒子叫盒模型. 盒模型有两种:标准模型和IE模型.这里重 ...
- javaWeb CSS 图像签名
<html> <head> <meta charset="utf-8" /> <title>CSS布局之图像签名</title ...
- iOS程序猿如何快速掌握 PHP,化身"全栈攻城狮"?
这是一篇以 iOS 开发人员的视角写给广大iOS 程序猿的 PHP 入门指南.在这篇文章里我努力去发掘 objectiv-c 与 php 之间的共性,来帮助有一定 iOS 开发经验的攻城狮来快速上手一 ...
- JAVA / MySql 编程—— 第三章 高级查询(一)
1. 修改表: (1)修改表名语法: ALTER TABLE <旧表名> RENAME [ TO ] <新表名>: 注意:其中[TO]为可选参数,使用与否不影响结 ...
- SQL tp3.2 批量更新 saveAll
/** * 批量更新数据 * @param [array] $datas [更新数据] * @param [string] $table_name [表名] */ public function sa ...
- GCJ:2008 Round1AA-Minimum Scalar Product(有序数组倒序乘积和最小)
题目链接:https://code.google.com/codejam/contest/32016/dashboard#s=p0 Minimum Scalar Product This contes ...
- POJ:2785-4 Values whose Sum is 0(双向搜索)
4 Values whose Sum is 0 Time Limit: 15000MS Memory Limit: 228000K Total Submissions: 26974 Accepted: ...
- Flume使用(案例分析)
Flume官方文档 Usage: bin/flume-ng <command> [options]... commands: help display this help text age ...
- MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ':ge
数据库表里命名有这个字段,可怎么就是报错呢,大神的解释: 加上之后立马好用!!!