📜  斯卡拉 |序列理解

📅  最后修改于: 2022-05-13 01:55:33.977000             🧑  作者: Mango

斯卡拉 |序列理解

推导具有(枚举器) yield e的结构,其中枚举器指的是以分号分隔的枚举器列表。枚举器要么是一个引入新变量的生成器,要么是一个过滤器。推导式计算枚举器生成的每个绑定的主体 e 并返回这些值的序列。在这个 Scala 中提供了一个轻量级的符号来传达序列理解。在测序中,可以在没有平面图的情况下进行多次提取。这可以通过两种方法通过使笛卡尔积重复或通过对象的排序列表来实现。不使用平面映射的另一种方法是为 Scala 中的验证计划一种特殊的自动生成语法。
序列理解语句具有生成器部分,该生成器部分从指定的输入范围生成值列表,以及对这些生成的元素进行操作的语句,然后将其存储在输出列表中以在计算结束时返回。支持 withFilter、map 和 flatMap 操作的每种数据类型(具有适当的类型)都可以用于序列推导。
让我们理解一些例子。
示例 #1:

Scala
// Scala program of sequence comprehensions
 
// Creating an object with extending APP
object CT extends App
{
    // Defining function with sequence comprehensions
    def even(from: Int, to: Int): List[Int] =
    for (a <- List.range(from, to) if a % 4 == 0) yield a
        Console.println(even(0, 20))
}


Scala
// Scala program of sequence comprehensions
 
// Creating object with extending App
object ComprehensionTest2 extends App
{
    // Defining function with sequence comprehensions
    def AddTill(n: Int, x: Int) =
        for (i <- 0 until n;
            j <- i until n if i + j == x) yield
        (i, j);
         
    // Calling function
    AddTill(12, 20) foreach
    {
        case (i, j) =>
        println(s"($i, $j)")
    }
}


输出:

List(0, 4, 8, 12, 16)

在此示例中,Integer 的新变量i绑定到列表List(from, from + 1, ..., to -1)的所有值。如果i % 4 == 0它会从列表中删除所有奇数,并给出在 0、20 之间完全可被 4 整除的数字的输出。
示例 #2:

斯卡拉

// Scala program of sequence comprehensions
 
// Creating object with extending App
object ComprehensionTest2 extends App
{
    // Defining function with sequence comprehensions
    def AddTill(n: Int, x: Int) =
        for (i <- 0 until n;
            j <- i until n if i + j == x) yield
        (i, j);
         
    // Calling function
    AddTill(12, 20) foreach
    {
        case (i, j) =>
        println(s"($i, $j)")
    }
}

输出:

(9, 11)
(10, 10)

这里的示例显示了序列推导并不局限于列表——每个操作都支持 flatMap。因此,输出计算 0 和 n-1 之间的所有数字对,其总和等于给定值x