!!!Scala Javaプログラマ向けチュートリアル [Scala] *http://docs.scala-lang.org/tutorials/scala-for-java-programmers.html !!!インポート *Scalaの強みの一つは、Javaと簡単に相互運用できること *java.lang パッケージはデフォルトでインポートされ、その他も必要に応じてインポートできる *Scalaのimportは、Javaによく似ているが、もっと強力である。 *_ を * の代わりに利用する(*はScalaの識別子のため) import java.util.{Date,Locale} import java.text.DateFormat import java.text.DateFormat._ object JpDate { def main(args: Array[String]) { val now = new Date val df = getDateInstance(LONG, Locale.JAPAN) println(df format now) } } 2013/12/18 *メソッドの引数が、1つの場合 挿入記法(infix syntax)を利用できる ""df format now *冗長にも書ける ""df.format(now) !!!すべてオブジェクト *Javaとことなり、数値や関数もオブジェクト !!数値もオブジェクト *以下のような計算式を scala> val x = 2 x: Int = 2 scala> 1 + 2 * 3 / x res1: Int = 4 *メソッドの呼び出しとしても書くことが出来る scala> (1).+(((2).*(3))./(x)) res2: Int = 4 *次のように書くと 1. が Doubleとみなされてしまう 1.+(2) *次のように記述する (1).+(2) !!関数もオブジェクト *Javaプログラマーにとって意外なのは、関数もオブジェクトだということだろう *関数を引数として渡すことがでる *変数に格納することができる *他の関数に戻り値として渡すことができる *関数を値として扱えることが、関数プログラミングの興味深いパラダイムの土台となっている object Timer { def oncePerSecond(callback: () => Unit) { while(true) { callback(); Thread sleep 1000 } } def timeFlies() { println("time flies like an arrow...") } def main(args: Array[String]) { oncePerSecond(timeFlies) } } !!無名関数 *上記の例を少し変えたもの *timeFiles関数は、oncePerSecond に渡されるためだけに定義されていた *一度しか使わないのに名前を持っていた *これらは不要に思われる *Scalaでは、無名関数を利用することが出来る *=> は関数の引数リストとボディを分ける *この例では、=>の左側の括弧に引数リストは無い object Timer { def oncePerSecond(callback: () => Unit) { while(true) { callback(); Thread sleep 1000 } } def main(args: Array[String]) { oncePerSecond( () => println("time flies like an arrow...")) } } !!!クラス *Scalaでは、クラスはJavaに近い文法で宣言する *一つ重要な違いは、クラスはパラメータを持つことが出来る *以下は、複素数を定義する例 class Complex(real: Double, imaginary: Double) { def re() = real; def im() = imaginary } *複素数クラスは、2つの引数をとり、インスタンス作成時に引数に値が与えられる必要がある