最简结构:三步走
想象你要「批量加工」一堆物品,步骤是:
- 拿一个筐(比如
List(1,2,3)
) - 逐个处理每个物品(比如每个数
n
) - 生成新筐(比如每个数变成平方)
写成代码就是:
scala复制代码
val 新筐 = for (物品 <- 旧筐) yield 加工后的物品
例子:水果变果干
scala复制代码
val 水果筐 = List("苹果", "香蕉", "橙子")
// 每个水果变成果干
val 果干筐 = for (水果 <- 水果筐) yield s"${水果}干"
// 结果:List("苹果干", "香蕉干", "橙子干")
加上过滤:只处理符合条件的
比如只要苹果做果干,其他不要:
scala复制代码
val 果干筐 = for {
水果 <- 水果筐
if 水果 == "苹果" // 只留苹果
} yield s"${水果}干"
// 结果:List("苹果干")
多层循环:组合加工
比如用苹果做果汁和果酱,香蕉只做果酱:
scala复制代码
val 水果 = List("苹果", "香蕉")
val 做法 = List("果汁", "果酱")
val 成品 = for {
f <- 水果 // 第一层循环:水果
z <- 做法 // 第二层循环:做法
if !(f == "香蕉" && z == "果汁") // 香蕉不做果汁
} yield s"${f}${z}"
// 结果:List("苹果果汁", "苹果果酱", "香蕉果酱")
核心规则
- 必须用
yield
:没有它,代码就只是循环,不会生成新集合。 - 箭头
<-
:表示从集合里「取出」元素。 - 代码顺序:先写循环(
<-
),再写过滤(if
)。
常见错误
❌ 忘记写 yield
:
scala复制代码
// 错误!返回的是 Unit(无结果)
for (n <- List(1,2)) { n * 2 }
✅ 正确:
scala复制代码
// 正确!返回新集合 List(2,4)
for (n <- List(1,2)) yield n * 2
一句话总结
for-yield
就是:「遍历一个筐里的每个东西,按条件处理,最后打包成新筐」。