回到上一节中的此示例
val doubledInts = ints.map((i: Int) => i * 2)
我们注意到表达式的这一部分是一个匿名函数
(i: Int) => i * 2
之所以称之为匿名,是因为它未分配给变量,因此没有名称。
但是,可以将匿名函数(也称为函数字面量)分配给变量以创建函数变量
val double = (i: Int) => i * 2
这将创建一个名为 double
的函数变量。在此表达式中,原始函数字面量位于 =
符号的右侧
val double = (i: Int) => i * 2
-----------------
新变量名位于左侧
val double = (i: Int) => i * 2
------
并且函数的参数列表在此处加下划线
val double = (i: Int) => i * 2
--------
与方法的参数列表一样,这意味着 double
函数接受一个参数,一个名为 i
的 Int
。您可以在 REPL 中看到 double
的类型为 Int => Int
,这意味着它接受一个 Int
参数并返回一个 Int
scala> val double = (i: Int) => i * 2
val double: Int => Int = ...
调用函数
现在,您可以像这样调用 double
函数
val x = double(2) // 4
您还可以将 double
传递到 map
调用中
List(1, 2, 3).map(double) // List(2, 4, 6)
此外,当您有 Int => Int
类型的其他函数时
val triple = (i: Int) => i * 3
您可以将它们存储在 List
或 Map
中
val functionList = List(double, triple)
val functionMap = Map(
"2x" -> double,
"3x" -> triple
)
如果您将这些表达式粘贴到 REPL 中,您会看到它们具有这些类型
// a List that contains functions of the type `Int => Int`
functionList: List[Int => Int]
// a Map whose keys have the type `String`, and whose
// values have the type `Int => Int`
functionMap: Map[String, Int => Int]
要点
这里的重要部分是
- 要创建函数变量,只需将变量名分配给函数字面量
- 一旦拥有一个函数,您就可以像对待任何其他变量一样对待它,即像
String
或Int
变量
并且,由于 Scala 3 中改进的 Eta Expansion 功能,您可以以相同的方式对待方法。
此页面的贡献者
内容
- 简介
- Scala 特性
- 为什么选择 Scala 3?
- Scala 简介
- 你好,世界!
- REPL
- 变量和数据类型
- 控制结构
- 领域建模
- 方法
- 一类函数
- 单例对象
- 集合
- 上下文抽象
- 顶级定义
- 总结
- 类型初探
- 字符串插值
- 控制结构
- 领域建模
- 工具
- 面向对象建模
- 函数式编程建模
- 方法
- 方法特性
- Scala 3 中的主方法
- 总结
- 函数
- 匿名函数
- 函数变量
- Eta 扩展
- 高阶函数
- 编写自己的 map 方法
- 创建返回函数的方法
- 总结
- 打包和导入
- Scala 集合
- 集合类型
- 集合方法
- 总结
- 函数式编程
- 什么是函数式编程?
- 不可变值
- 纯函数
- 函数即值
- 函数式错误处理
- 总结
- 类型和类型系统
- 推断类型
- 泛型
- 交集类型
- 并集类型
- 代数数据类型
- 协变
- 不透明类型
- 结构类型
- 依赖函数类型
- 其他类型
- 上下文抽象
- 扩展方法
- 上下文参数
- 上下文界限
- 给定导入
- 类型类
- 多重宇宙等式
- 隐式转换
- 总结
- 并发
- Scala 工具
- 使用 sbt 构建和测试 Scala 项目
- 工作表
- 与 Java 交互
- 面向 Java 开发人员的 Scala
- 面向 JavaScript 开发人员的 Scala
- 面向 Python 开发人员的 Scala
- 下一步