Scalaはオブジェクト指向言語です(1)
こんなタイトルを付けてみましたが、これは単なる冗談でなく、「関数型」というなんだか小難しそうなイメージが定着している概念を知ること無く、JavaプログラマにScalaを説明してみようという試みです。この記事で、少しでもScalaに対するとっつきずらさを払拭できたらなあと思っています。
Scalaの主な機能
- クラス:Javaのクラスと記法が違いますが、大体同じです。
class A { }
- トレイト:メソッドも実装できる便利なインタフェースです。
trait A { def hoge() { println("hoge") } } class B extends A {} new B().hoge
インタフェースにメソッドが定義できて嬉しいですね。
- オブジェクト:GoFのシングルトンパターンを言語レベルでサポートしただけです。
object A { val i = 10 }
とかやると、Aという名前でシングルトンオブジェクトにアクセスできます。
- 無名関数:使い易い無名クラス
(x: Int) => x + 1
というなんだか難しそうな表記は、単に、new Function1[Int] { def apply(x: Int): Int = x + 1 }
の簡易記法です。Javaで言えば、
new Function1<Integer>() { public Integer apply(Integer x) { return x + 1; } }
ですね。無名クラスをよく使う人にとっては嬉しい機能だと思います。
- パターンマッチ:強化版switch文のようなものです。
x match { case 1 => case 2 => case 3 => }
とか書きます。caseの後はswitchのcaseと似たようなものですが、文字列とか色々書けて便利です。Javaは整数とenumしか指定できなくて不便ですよね。あと、break書き忘れてfall throughする心配もありません。
- 文末にセミコロンが要りません
println("Hello")
セミコロンをいちいち書くのは面倒ですよね。
- whileもあります
var i = 1 while(i < 10) { println(i) i += 1 }
普通にJavaのように書けて安心です。
- case class:単にちょっとした自動生成コードを吐いてくれるだけの機能
case classってなんか怖そうですが、仕組みは単純です。case class A
と書くと、Scalaの中の人が頑張って
class A object A { def apply(): A = new A ... }
みたいなコードを自動生成してくれます。enumでもJavaの中の人が頑張って色々自動生成してくれますが、それと同じようなものです。
- ジェネリクス:Javaと大体同じように書けます。記法がちょっと違うだけです。
class Hoge[T] { def hoge(t: T): T = t }
これは、Javaの
public class Hoge<T> { T hoge(T t) { return t; } }
と同じ意味です。
- 型推論:面倒な記述を削減してくれます。
Javaで、Map<Integer, String> map = new HashMap<Integer, String>();
とか似たようなことを二度も書かされて面倒ですよね。Scalaなら、
val map = new HashMap[Integer, String]();
と書くだけでOKです。mapの型はよきにとりはからってくれるので、実行時エラーの心配はありません。
まだ他にもいくつかありますが、とりあえず今日はここまで。関数型というなんか難しそうな概念を知らなくても、Scalaの事を理解する事は十分可能だ、ということを伝えたいと思います。もちろん、関数型の概念を知っているに越したことは無いのですが、知らなくてもScalaを使うことはできます。