Scala yield 关键字怎么用?

文章导读
Previous Quiz Next 您可以将“for”循环的返回值存储到变量中,或者通过函数返回。要实现这一点,需要在 'for' 表达式的主体前加上关键字 yield。
📋 目录
  1. A Scala Yield 关键字示例
  2. B 使用 Yield 关键字将元素加倍
A A

Scala - Yield 关键字



Previous
Quiz
Next

您可以将“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)