在java中我们遍历一个集合然后处理返回一个新集合,我们需要先定义一个新集合,然后在循环中put,然而在Scala中做这件事的语法就简单很多。
使用yield 关键字便能在for 表达式中生成新的集合。
另外,我们将转而使用大括号代替圆括号,以相似的方法把参数列表封装在大括号中时可以使得块结构的格式看起来更为直观:
val dogBreeds = List("Doberman", "Yorkshire Terrier", "Dachshund", "Scottish Terrier", "Great Dane", "Portuguese Water Dog") val filteredBreeds = for { breed <- dogBreeds if breed.contains("Terrier") && !breed.startsWith("Yorkshire") } yield breed
每次执行for 表达式时,过滤后的结果将生成breed 值。随着代码的执行,这些结果值逐渐积累起来,累计而成的结果值集合被赋给了filteredBreeds 对象。for-yield表达式所生成的集合类型将根据被遍历的集合类型推导而出。在上面的例子中,由于filteredBreeds 源于dogBreeds 列表, 而dogBreeds 类型为List[String], 因此filteredBreeds 的类型为List[String]。
for 推导式有一个不成文的约定:当for 推导式仅包含单一表达式时使用原括号,当其包含多个表达式时使用大括号。值得注意的是,使用原括号时,早前版本的Scala 要求表达式之间必须使用分号。
假如一个for 推导式并未使用yield,而是执行像打印这样的具有副作用的操作,那么我们将其称为for 循环。这是因为它的行为更像是你所熟悉的Java 和其他语言中的for 循环。否则就称为for 推导式。