Scalaを選ぶ理由
Scala スケーラブルプログラミングの1章を簡単にまとめ
互換性(Javaとの共存)
例1)Scalaの文字リテラル"abc"の型はjava.lang.Stringである
例2)投げらる例外はjava.lang.Throwableでないといけない
- Scalaは再利用だけでなく「ドレスアップ」してもっといいもにしている
例1)JavaのStringクラスはStringをintに変換するときはInteger.parseInt(str)でないといけなけど、ScalaならtoIntメソッドを提供しているのでstr.toIntで実現できる
(中ではScalaコンパイラはStringにはtoIntメソッドがないことに気づいて暗黙の型変換を参照する。それによってJavaのStringをScalaのStringOpsに変換することを知って、そこでtoIntを見つける)
簡潔性(Javaの半分のコード量)
- 少なければ読んで理解する労力、バグの確率も下がる
- セミコロンを書かなくていい
- コンストラクタの違い ※1
- 型情報を反復する必要がない型推論
- ライブラリが豊富なので、その分の量が減る
- ライブラリークラスの様々な側面はトレイトとして、切り分けるし、トレイト柔軟にミックスできる
※1
Java
class MyClass { private int index; private String name; public MyClass(int index, String name) { this.index = index; this.name = name; } }
class MyClass(var index; Int, var name: String) {}
高水準(抽象度の高いコード、あたらし制御構造を定義できる表現力)
- Stringに大文字が含まれているか ※2
- Javaはループで一文字ずつ処理する低水準の存在として文字列をあつかっている
- Scalaは述語関数でテストできるように高い水準の存在として同じ文字列を扱える
※2
Java
boolean nameHasUpperClass = false; for (int i = 0; i < name.length(); ++i) { if (Character.isUpperCase(name.charAt(i))) { nameHasUpperCase = true; break; } }
val nameHasUpperCase = name.exists(_.isUpper)