《Scala by Example》第10章 For-循环

  第一个例子,给出一个Person列表,name和age作为属性,打印出年龄大于20的人的名字,可以这么写:

for ( p <- persons if p.age > 20) yield p.name

  一般情况下,for表达式是这样的:for(s) yield e。这里的s是一个生成器(generators),定义(definitions)和过滤器(filters)的列表。

  • 生成器:val x <- e ,e是一个列表性的表达式。把x与一个列表里的连续性值绑定在一起。
  • 定义:val x = e 。在表达式的剩下部分,都可以用x来表示e。
  • 过滤器:是一个Boolean型的表达式f,如果f是false的,绑定的值就会被隐藏掉(应该是过滤掉)。

这个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

  

  

  

你可能感兴趣的:(example)