Scala 序列的理解力
Comprehensions的结构为(enumerators) yield e ,其中enumerators指的是一个分号分隔的枚举器列表。枚举器要么是一个引入新变量的生成器,要么是一个过滤器。编译器对枚举器生成的每个绑定体e进行评估,并返回这些值的序列。在此,Scala提供了一个轻量级的符号来传达 序列理解。 在序列中,有可能在没有平面图的情况下进行多次提取。这可以通过两种方法实现,一是进行卡特尔乘积重复,二是通过对象的序列列表进行排序。还有一种不使用平面地图的方法是为Scala中的验证计划一个特殊的自动生成的语法。
序列理解 语句有生成器部分,它从指定的输入范围中生成一个值列表,还有一个语句对这些生成的元素进行操作,然后存储在输出列表中,在计算结束后返回。每一个支持Filter、map和flatMap操作的数据类型(有适当的类型)都可以用于序列理解。
让我们了解一些例子。
例子#1:
// 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))
}
输出:
List(0, 4, 8, 12, 16)
在这个例子中,一个新的整数变量 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。
极客教程