Scala循环for if 保护式条件守卫

2019-05-04 09:23:39 | 编辑 | 添加

除了if 语句之外,Scala 也为for 循环这一常见的控制结构提供了非常多的特性,这些for 循环的特性被称为for 推导式(for comprehension)或for 表达式(for expression)。事实上,推导式一词起源于函数式编程。它表达了这样一个理念:我们遍历一个或多个集合,对集合中的元素进行“推导”,并从中计算出新的事物,新推导出的事物往往是另一个集合。


1.Scala for循环 生成器表达式

val dogBreeds = List("Doberman", "Yorkshire Terrier", "Dachshund",
"Scottish Terrier", "Great Dane", "Portuguese Water Dog")
for (breed <- dogBreeds)
println(breed)

你可能已经猜到了,这段代码的意思是:“基于列表dogBreeds 中的每一个元素,创建临时变量breed,breed 的值与元素值相同,之后打印breed。”代码输出如下:

Doberman
Yorkshire Terrier
Dachshund
Scottish Terrier
Great Dane
Portuguese Water Dog

这种形式不返回任何值,因此它只会执行一些会带来副作用的操作。这类for 推导式有时候也被称为for 循环,这与Java 中的for 循环较为类似。


像breed <- dogBreeds 这样的表达式也被称为生成器表达式(generator expression),生成器表达式之所以叫这个名字,是因为该表达式会基于集合生成单独的数值。左箭头操作符(<-) 用于对像列表这样的集合进行遍历。我们还可以使用生成器表达式对某些区间进行访问,以这种方式编写出的for 循环更加自然。

for (i <- 1 to 10) println(i)


2.Scala循环for if 条件守卫保护式

我们可以加入if 表达式,来筛选出我们希望保留的元素。这些表达式也被称为保护式(guard)。 为了能够从犬种列表中挑选中犬,我们对之前的代码进行了修改,具体如下:

val dogBreeds = List("Doberman", "Yorkshire Terrier", "Dachshund",
"Scottish Terrier", "Great Dane", "Portuguese Water Dog")
for (breed <- dogBreeds
if breed.contains("Terrier")
) println(breed)


输出如下:

Yorkshire Terrier
Scottish Terrier

你还可以在for 循环中添加多个保护式:

val dogBreeds = List("Doberman", "Yorkshire Terrier", "Dachshund",
"Scottish Terrier", "Great Dane", "Portuguese Water Dog")
for (breed <- dogBreeds
if breed.contains("Terrier")
if !breed.startsWith("Yorkshire")
) println(breed)
for (breed <- dogBreeds
if breed.contains("Terrier") && !breed.startsWith("Yorkshire")
) println(breed)


在第二个for 推导式中,两个if 语句被合并为一个语句。这两个for 推导式的输出如下

所示:

Scottish Terrier
Scottish Terrier