scala中yield
时间: 2025-05-03 13:50:14 浏览: 31
### Scala 中 `yield` 的使用方法
在 Scala 中,`yield` 是一种强大的工具,用于与 `for` 表达式结合来生成新的集合。当遍历一个集合并应用某些条件或转换操作时,`yield` 可以捕获每次迭代的结果并将这些结果组合成一个新的集合。
#### 基本语法
以下是 `for-yield` 结构的基本形式:
```scala
val result = for {
element <- collection // 遍历集合中的每个元素
if condition(element) // 应用过滤条件(可选)
} yield transformation(element) // 对满足条件的元素执行变换
```
在这个结构中:
- `collection` 是要遍历的原始集合。
- `condition(element)` 是一个布尔表达式,用来筛选符合条件的元素(如果存在的话)。
- `transformation(element)` 是对每个符合条件的元素进行的操作,其返回值会被收集到新集合中。
---
#### 示例代码
##### 示例 1:简单的数值平方计算
下面的例子展示了如何通过 `for-yield` 计算范围 `[1, 5]` 内所有数的平方[^4]:
```scala
val squares = for (i <- 1 to 5) yield i * i
println(squares.mkString(", ")) // 输出: 1, 4, 9, 16, 25
```
##### 示例 2:带条件过滤
此示例演示了如何仅保留偶数,并将其乘以 10 后存入新集合:
```scala
val numbers = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
val filteredAndTransformed = for {
num <- numbers
if num % 2 == 0 // 过滤掉奇数
} yield num * 10
println(filteredAndTransformed.mkString(", ")) // 输出: 20, 40, 60, 80, 100
```
##### 示例 3:字符串长度统计
该例子说明了如何利用 `yield` 将一组水果名称与其对应的字符长度配对[^5]:
```scala
val fruits = List("apple", "banana", "cherry")
val fruitLengths = for (fruit <- fruits) yield (fruit, fruit.length)
println(fruitLengths.mkString(", ")) // 输出: ("apple",5), ("banana",6), ("cherry",6)
```
##### 示例 4:嵌套循环
可以使用嵌套的 `for` 循环配合 `yield` 创建更复杂的集合[^3]:
```scala
val combinations = for {
x <- List(1, 2, 3)
y <- List('a', 'b')
} yield (x, y)
println(combinations.mkString(", ")) // 输出: (1,a), (1,b), (2,a), (2,b), (3,a), (3,b)
```
---
#### 特殊情况处理
有时可能需要中断循环或者跳过特定逻辑。虽然 Scala 不像其他语言那样支持显式的 `break` 和 `continue`,但可以通过引入外部库实现类似功能[^2]:
```scala
import scala.util.control.Breaks._
val nonDivisibleByThree = new Breaks().withBreak {
var results = List[Int]()
for (i <- 1 to 10) {
breakable {
if (i % 3 == 0) break()
else results = results :+ i
}
}
results
}
println(nonDivisibleByThree.mkString(", ")) // 输出: 1, 2, 4, 5, 7, 8, 10
```
上述代码片段实现了不被 3 整除的数字提取过程。
---
### 总结
`yield` 提供了一种简洁而优雅的方式来构建基于现有数据集的新集合。无论是简单映射还是复杂过滤器链,都可以轻松完成任务。需要注意的是,`for` 表达式本质上是一个语法糖,底层依赖于诸如 `map`, `flatMap`, 或者 `filter` 等高阶函数。
阅读全文
相关推荐



















