全てがオブジェクト

Scala は純粋オブジェクト指向言語です。これには、数値や関数も含まれます。Java でいうプリミティブ型はありません。
以下の2つは同じ意味になります。

1 + 2 * 3
1.+(2.*(3))

1行目は実際には+メソッドと*メソッドの呼び出しとなっています。これは Scala が自明なメソッド呼び出しの () を省略可能となってるので普通の算術式みたいに書けるのです。


また関数もオブジェクトです。そのため関数を引数に渡したり、それらを変数として格納したり、他の関数からの戻り値としたりすることができます。これらの側面は関数型の特徴ですね。

object Hello extends Application {
  def speak(greeting: () => unit) {
    greeting()
  }
  def hello() {
    println("Hello")
  }
  
  speak(hello)
}

この例を実行するとHelloとまぁそのまま表示されます。speak関数にhello関数を渡しているわけです。
speak関数の引数の () => unit は引数を取らず、また戻り値も無い全ての関数を表す型であることを意味してます。

無名関数

上の例を無名関数にするとこんな感じ

object Hello extends Application {
  def speak(greeting: () => unit) {
    greeting()
  }
  
  speak( () => println("Hello") )
}

結果はまぁ同じ