fors.scala

来自「JAVA 语言的函数式编程扩展」· SCALA 代码 · 共 113 行

SCALA
113
字号
package examplesimport scala.xml._object fors {  val e = Node.NoAttributes  class Person(_name: String, _age: Int) {    val name = _name    val age = _age  }  def printOlderThan20(xs: Seq[Person]): Iterator[String] =    printOlderThan20(xs.elements)  def printOlderThan20(xs: Iterator[Person]): Iterator[String] =    for (p <- xs if p.age > 20) yield p.name  val persons = List(    new Person("John", 40),    new Person("Richard", 68)  )  def divisors(n: Int): List[Int] =    for (i <- List.range(1, n+1) if n % i == 0) yield i  def isPrime(n: Int) = divisors(n).length == 2  def findNums(n: Int): Iterable[(Int, Int)] =    for (i <- 1 until n;         j <- 1 until (i-1);         if isPrime(i+j)) yield (i, j)  def sum(xs: List[Double]): Double =    xs.foldLeft(0.0) { (x, y) => x + y }  def scalProd(xs: List[Double], ys: List[Double]) =    sum(for((x, y) <- xs zip ys) yield x * y)  type Lst = List[Any]  val prefix = null  val scope = TopScope  val books = List(    Elem(prefix, "book", e, scope,         Elem(prefix, "title", e, scope,              Text("Structure and Interpretation of Computer Programs")),         Elem(prefix, "author", e, scope,              Text("Abelson, Harald")),         Elem(prefix, "author", e, scope,              Text("Sussman, Gerald J."))),    Elem(prefix, "book", e, scope,         Elem(prefix, "title", e, scope,              Text("Principles of Compiler Design")),         Elem(prefix, "author", e, scope,              Text("Aho, Alfred")),         Elem(prefix, "author", e, scope,              Text("Ullman, Jeffrey"))),    Elem(prefix, "book", e, scope,         Elem(prefix, "title", e, scope,              Text("Programming in Modula-2")),         Elem(prefix, "author", e, scope,              Text("Wirth, Niklaus")))  )  def findAuthor(books: Lst) =    for (Elem(_, "book", _, _, book @ _*) <- books;         Elem(_, "title", _, _, Text(title)) <- book.toList;         if (title indexOf "Program") >= 0;         Elem(_, "author", _, _, Text(author)) <- List(book)) yield author  for (Elem(_, "book", _, _, book @ _*) <- books;       Elem(_, "author", _, _, Text(author)) <- book.toList;       if author startsWith "Ullman";       Elem(_, "title", _, _, Text(title)) <- List(book)) yield title  removeDuplicates(    for (Elem(_, "book", _, _, b1 @ _* ) <- books;         Elem(_, "book", _, _, b2 @ _*) <- books;         if b1 != b2;         Elem(_, "author", _, _, Text(a1)) <- b1.toList;         Elem(_, "author", _, _, Text(a2)) <- b2.toList;         if a1 == a2) yield Pair(a1, a2))  def removeDuplicates[a](xs: List[a]): List[a] =    if (xs.isEmpty)      xs    else      xs.head :: removeDuplicates(for (x <- xs.tail if x != xs.head) yield x)  def main(args: Array[String]) {    print("Persons over 20:")    printOlderThan20(persons) foreach { x => print(" " + x) }    println    println("divisors(34) = " + divisors(34))    print("findNums(15) =");    findNums(15) foreach { x => print(" " + x); }    println    val xs = List(3.5, 5.0, 4.5)    println("average(" + xs + ") = " + sum(xs) / xs.length)    val ys = List(2.0, 1.0, 3.0)    println("scalProd(" + xs + ", " + ys +") = " + scalProd(xs, ys))  }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?