第一个例子,给出一个Person列表,name和age作为属性,打印出年龄大于20的人的名字,可以这么写:
for ( p <- persons if p.age > 20) yield p.name
一般情况下,for表达式是这样的:for(s) yield e。这里的s是一个生成器(generators),定义(definitions)和过滤器(filters)的列表。
这个S以一个生成器为开头,如果有多个生成器(也就是嵌套),里面的生成器比外面的变动更快。
S也可以用{}来代替()。举例如下:
sum(for((x , y ) <- xs zip ys) yield x * y)
10.1 N皇后问题(这部分跟《Scala编程》书上一样,略过)
10.2 用For表达式做查询
举例如下:查询Books。Books的定义如下:
case class Book(title : String , authors : List[String])
定义books如下:
val books: List[Book] = List( Book("Structure and Interpretation ", List("Abelson , Harold", "Sussman")), Book("Principles of Compiler Design", List("Aho, Alfred", "Ullman, Jeffrey")), Book("Programming in Modula-2", List("Wirth, Niklaus")), Book("Introduction to Functional Programming", List("Bird, Richard")), Book("The Java Language Specification", List("Gosling, James", "Joy, Bill", "Steele, Guy", "Bracha, Gilad")))
查询作者名以“Ullman”结尾的:
for(b <- books ; a <- b.authors if a startsWith "Ullman")
10.3 For表达式的翻译
For表达式一般可以被翻译成三个高阶函数的使用:map , flatMap , filter。具体转换方法在书上有写。知道就行。
10.4 For循环
语法跟之前的一样,只是没有yield关键字。
10.5 总结For