はじめに
2年ほどScalaをメインに仕事をしていたのですが、色々な諸事情により数年ぶりにJavaで開発中なのですが、その中でScalaが恋しくなった機能をまとめていきたいと思います。
Scalaは Scala 2.12.x
、Javaは Java 8
を使って開発しています。
では早速いきます。(思いついた順なので、順番に特に意味はありません)
型推論
Scalaを書いていた時は外部に公開しない変数やメソッドの型は省略していましたが、Javaさんは絶対に許してくれません。
最初は書くリズムが全然つかめませんでした。
Java 10からは一定のルール(?)の中では省略できるようになっているんですね。
JavaはJava 7から時が止まっていたので全然知りませんでした。
ifなどで値を返す
Javaに戻ってとってもありがたみを感じました。
Javaには3項演算子がありますが、私が携わっていたプロジェクトではだいたい規約で禁止されていました。
Scalaだとこんな感じで書いてたんですが
val mode = if ( 条件式 ) "xxx" else "yyy"
Javaだと値を返せないので
String mode;
if ( 条件式 ) {
mode = "xxx";
} else {
mode = "yyy";
}
こんな感じでしょうか?
昔は全然気になっていませんでしたが、再代入の文化を離れているととっても気持ち悪かったです。
色々省略できる
Scalaは色んなものが省略できますが、久々にJavaを書いてて一番書き忘れたのは以下の3つです。
各行の ;
メソッドの最後の return
引数なし、副作用のないメソッドの ()
型のエイリアス
Javaはimport時に名前を変えられません。
なので別パッケージにある同じクラスを使う時は残念な感じです。
クラス名が何か気持ち悪いなと思ったら、名前が変えられないので苦肉の策だったのかなと思って読むことにしました。
文字列に変数を埋め込むアレ
こういうやつです。(補間子 (interpolator)って言うんですね)
val name = "James"
println(s"Hello, $name")
文字列連結しまくってformatterで折り返されて結局どんな文字列が生成されるかよくわからんとか、format使ってるけど1個引数足りなくない?とか多くない?とか書式忘れたとか色々困りました。
文字列のエスケープが要らなくなるアレ
raw string literalと言って、補間子の1種類なんですね。
仕事柄、Jsonをよく扱うのですがScalaだとこう書けます。
val json = """
{
"id": "12345",
"name": "James"
}
"""
Javaだと、、、
String json = "{\n"
+ " \"id\": \"12345\",\n"
+ " \"name\": \"James\"\n"
+ "}";
ツラいです。。。
エディタでJson書いて、Intellijに貼り付けるしかありません。
(ダメ元で貼り付けたら自動でエスケープしてくれて助かりました)
最後に
この他にも色々ありましたが、副作用との戦いがありすぎて忘れました。
これからもScalaだったらこう書けるのにって思いながら、Javaに付き合っていこうと思います。