株式会社リクルートスタッフィングが運営するITSTAFFINGでは、弊社に派遣登録いただいている皆さまのスキル向上を支援するイベントを、定期的に開催しています。
2019年2月13日のイベントでは「今注目のJVMプログラミング言語『Scala』を学ぶ!~Javaエンジニアに向けたScalaの概要~」と題して、書籍『実践Scala入門』の著者である水島宏太さんを講師にお迎えし、スケーラブルなシステムの開発で注目されるプログラミング言語Scalaの基礎を解説していただきました。
・ポストJavaとJVM言語
・どのJVM言語を学ぶべきか
・JavaからScalaへ
【講師プロフィール】
水島 宏太さん
筑波大学大学院システム情報工学研究科コンピュータ・サイエンス専攻修了[博士(工学)]。大学院在籍時からScalaを継続して追いかけ、アジア最大のScalaイベントであるScalaMatsuriの前身「Scala Conference in Japan 2013」の発起人でもある。現Japan Scala Association代表理事。株式会社ドワンゴ勤務。著書に『オープンソース徹底活用Scala実践プログラミング』(共著、秀和システム)、『実践Scala入門(共著)』(技術評論社)、『Scala スケーラブルプログラミング(監修)』(インプレス)などがある。
ポストJavaとJVM言語
Javaだけ知っていればいいという時代でないということは、何となくわかっているものの、Javaは依然として重要な言語であり、Javaに加えてそれ以外の言語も覚えなければと考える人が増えています。そうした人たちの間で現在、注目されているのが、JVM言語だそうです。
JVM言語とは、処理系がJVM(Java仮想マシン)上で動作する言語の総称で、主なものとしてScala、Kotlin、Clojureなどがあります。そして、なぜJVM言語が注目されるかと言えば、Javaエンジニアにとって学びやすいからなのだそうです。
どのJVM言語を学ぶべきか
JVM言語はどれも同じというわけではなく、それぞれ長短があり、水島さんがそれをわかりやすく紹介してくださいました。
Javaの資産をほぼ完全に使えるというのは、Scalaの大きなメリットですね。また、Better Javaとして使えるというのは、Javaのような書き方もできる上に、Javaでは使いにくかった部分や難しかった部分が、簡潔に記述できるという意味だそうです。
KotlinもBetter Javaとして使えますが、現状ではAndroidアプリ開発以外の実績が少ないことがネックだといいます。
Clojureは良くも悪くも、静的な型がないことが特徴だそうです。IDEのサポートが弱いというのも、少し手を出しにくい印象がします。
大まかにまとめると、Androidアプリを中心に開発を行うのであればKotlin、サーバーサイド中心の開発を行うのであればScala、型が不要ならばClojureを選ぶのがよい、という結論でした。
イベントでは、Javaの復習も踏まえて説明されたのですが、Javaが抱える課題として、以下のようなものが挙げられました。
ラムダ式とは、Functional Interface(FI)を持つオブジェクトのメソッドを実装するための記法でJava8から実装されているそうです。
上記のように、インターフェイスにRunnableを使う場合、メソッドに引数を渡したり、メソッドからの戻り値を受け取ったりすることができません。そこでJava8からは、多数のFIがjava.util.functionパッケージ以下に追加されているそうです。
このように、言語を設計した当所はあまり考慮されていなかったり、後から登場した概念を実装するため「増築」を繰り返していったりしたことで、Javaにもさまざまな問題点が生じ始めているようです。
そこでScalaの登場です。JavaエンジニアがScalaを学ぶことで、次のようなメリットが生じます。
高階関数というのは、関数を引数にする、あるいは関数を戻り値とする関数のことで、たとえばリスト構造の各要素に対して順々に与えられた関数を処理していくmap()などが、これに相当するそうです。
JavaからScalaへ
そして、いよいよJavaとScalaの違いに迫ります。セミナーでは、事前にScalaの基礎文法の丁寧な説明もありましたが、ここでは割愛します。まずはJavaの記述とScalaの記述の違いから。
ScalaはBetter Javaとしても使えますが、Scala本来の方法で記述することもできます。
しかし、この後のサンプルはいずれもBetter JavaとしてのScalaの記述です。まずは、ジェネリックなクラスの定義について見てみましょう。
同様に、ジェネリックなメソッドの定義についても見てみましょう。
Java8から実装されているFIを利用したStream APIの記述も見てみましょう。これもJavaで記述する場合と、Scalaで記述する場合で下図のように異なります。
上図で、Javaは、コレクションnumbersからstream()で、ラムダ式を渡せるStream形式に変換し、高階関数であるmap()でStreamに対する操作を行い、collect()で終端操作をしています。
いっぽうScalaでは、StreamAPIと同様の操作も簡潔で、終端操作も記述する必要がなく、すっきりとしたコードで記述できていることがわかります。リストに対する処理は多用するため、冗長で煩雑な記述が簡略化されるメリットはとても大きいと思います。
Scalaというと並列分散処理が記述しやすいとか、関数型言語という特徴などが、真っ先に取り上げられがちですが、今回学んだように、まずはBetter Javaとして使うというのが、導入としてはよさそうです。Javaの延長線としてScalaを使い、段階的にScala流の記述を学んでいくことができるというのは大きな魅力です。エンジニアとしての幅を広げるために「次はScala」という選択肢を、考えてみませんか。