Scala - Yield 关键字
您可以将“for”循环的返回值存储到变量中,或者通过函数返回。要实现这一点,需要在 'for' 表达式的主体前加上关键字 yield。
语法
以下是使用 yield 关键字的语法 −
var retVal = for {
var x <- List
if condition1
if condition2
...
} yield x
注意 − 这里使用了花括号来包含变量和条件,retVal 是一个变量,所有 x 的值将以 collection 的形式存储其中。
Scala Yield 关键字示例
尝试以下示例程序来理解带有 yield 的循环 −
object Demo {
def main(args: Array[String]) {
var a = 0
val numList = List(1,2,3,4,5,6,7,8,9,10)
// 使用 yield 执行 for 循环
var retVal = for {
a <- numList
if a != 3
if a < 8
} yield a
// 现在使用另一个循环打印返回值。
for (a <- retVal) {
println("Value of a: " + a)
}
}
}
在上述示例中,我们首先使用条件 a != 3 和 a < 8 过滤元素。因此,它只会选择不等于 3 且小于 8 的元素。现在,yield 关键字用于将选中的元素收集到一个新的列表 retVal 中。第二个 for 循环遍历 retVal 并打印每个元素。
将上述程序保存为 Demo.scala。使用以下命令编译和执行该程序。
命令
\>scalac Demo.scala \>scala Demo
输出
value of a: 1 value of a: 2 value of a: 4 value of a: 5 value of a: 6 value of a: 7
使用 Yield 关键字将元素加倍
使用 yield 将列表中的每个元素加倍 −
object DoubleDemo {
def main(args: Array[String]) = {
val numbers = List(1, 2, 3, 4, 5)
val doubled = for (n <- numbers) yield n * 2
println(doubled) // Output: List(2, 4, 6, 8, 10)
}
}
在这个示例中,yield 关键字从 numbers 中取出每个元素 n,将其加倍 (n * 2),并将结果收集到一个新的列表 doubled 中。
将上述程序保存为 DoubleDemo.scala。使用以下命令编译和执行该程序。
命令
\>scalac DoubleDemo.scala \>scala DoubleDemo
输出
List(2, 4, 6, 8, 10)
从两个列表创建配对并计算它们的乘积。
object ProductDemo {
def main(args: Array[String]) = {
val list1 = List(1, 2, 3)
val list2 = List(4, 5, 6)
val products = for {
a <- list1
b <- list2
} yield a * b
println(products) // Output: List(4, 5, 6, 8, 10, 12, 12, 15, 18)
}
}
在这个示例中,对于 list1 中的每个元素 a 和 list2 中的每个元素 b,都会计算它们的乘积 a * b 并收集到 products 列表中。
将上述程序保存为 ProductDemo.scala。使用以下命令编译和执行该程序。
命令
\>scalac ProductDemo.scala \>scala ProductDemo
输出
List(4, 5, 6, 8, 10, 12, 12, 15, 18)