从上一节回到这个例子:
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 函数式,您可以以相同的方式处理 方法。
Contributors to this page:
Contents
- 导言
- Scala 3 特性
- 为什么是 Scala 3 ?
- Scala 的味道
- Hello, World!
- The REPL
- 变量和数据类型
- 控制结构
- 领域建模
- 方法
- 头等函数
- 单例对象
- 集合
- 上下文抽象
- 顶层定义
- 总结
- 类型初探
- 字符串插值
- 控制结构
- 领域建模
- 工具
- OOP 领域建模
- 函数式领域建模
- 方法
- 方法特性
- main 方法
- 总结
- 函数
- 匿名函数
- 函数变量
- Eta 扩展
- 高阶函数
- 自定义 map 函数
- 创建可以返回函数的方法
- 总结
- 打包和导入
- Scala 集合
- 集合类型
- 集合方法
- 总结
- 函数式编程
- 什么是函数式编程?
- 不可变值
- 纯函数
- 函数是值
- 函数式错误处理
- 总结
- 类型和类型系统
- 类型推断
- 泛型
- 相交类型
- 联合类型
- 代数数据类型
- 型变
- 不透明类型
- 结构化类型
- 依赖函数类型
- 其他类型
- 上下文抽象
- 扩展方法
- Given 实例和 Using 语句
- 上下文绑定
- Given 导入
- 实现类型类
- 多元相等性
- 隐式转换
- 总结
- 并发
- Scala 工具
- 使用 sbt 构建和测试 Scala 项目
- worksheet
- 与 Java 交互
- 向 Java 开发者介绍Scala
- Scala for JavaScript Developers
- Scala for Python Developers
- 下一步去哪