在Scala中,一切皆对象!比Java的面向对象理念还彻底!
Scala里,数字是对象,函数也是对象!

数字是对象
比如:1 + 2 * 3 / 2,和下面这个是一样的:
(1).+(((2).*(3))./(2))

enter image description here

可以看出,“+”,“-”,“*”,“/”在Scala中同样是有效的名称。
在第二个表达式中的这些括号是必须的,因为 Scala 的分词器使用最长规则来进行分词。所以它会把下面的表达式:
1.+(2)
理解成表达项“1.”,“+”,和“2”的组合。这样的组合结果是由于“1.”是一个有效的表达项并且比表达项“1”要长,表达项“1.”会被当作“1.0”,使得它成为一个double类型而非int类型。而下面的表达式阻止了分析器错误的理解:
(1).+(2)

函数是对象
把函数当成值进行操作是函数型编程语言的基石。
函数在Scala语言里面是一个对象,把函数作为参数进行传递,把它们存贮在变量中,或者当作另一 个函数的返回值都是可能的。
函数是对象,将给Scala填上无穷的威力,这点是Java语言做不到的。
来看个计时器的例子:

object Timer {

   def oncePerSecond(callback: () => Unit) {
       while (true) {callback(); Thread sleep 1000 }
   }

   //作为回调的函数
   def timeFlies() {
       //使用预定义的函数println,而非使用System.out.println(...)
       println("每秒都打印一下..")
   }

   //主函数调用计时器并传递打印句子的函数作为回调,这个程序永无止境的每秒打印一句话
   def main(args: Array[String]) {
       oncePerSecond(timeFlies)
   }
}

运行如下:
enter image description here

用匿名函数改进定时器程序
上面的定时器函数完全可以用匿名函数写得更简洁一些的。

object TimerAnonymous {
   def oncePerSecond(callback: () => Unit) {
       while (true) {callback(); Thread sleep 1000 }
   }

   def main(args: Array[String]) {

       oncePerSecond(() =>
           println("每秒都打印一下.."))
   }
}

有没有发现呢?Scala真的很酷!很多好玩的!

enter image description here