ぬまのそこ

namazuのゆるいエンジニアブログ

Java9の新機能をちょろっと触ってみた

はじめに

この記事は、私の所属する田胡研究室のアドベントカレンダー9日目の記事です。

adventar.org

Java9

Java9が9月にリリースされてから早3ヶ月。 私はJava7のコードを某所で今も書かされています。

StreamApiがないJavaとかマジやってらんね。 for文でリストの写像とかしなきゃいけないんですよ。 マジだるい。

さっさとJava9に置き換えろこの野郎という怒りをぶつけながらこの記事を書こうと思います。 

Java9で変わった大きな変更と、使えそうな典型をちょろっとしたコード共に紹介します。

JEP

Java9の新機能はJEPとして提案されOpenJDK開発コミュが対応しました。

http://openjdk.java.net/projects/jdk9/

ここにまとまってます。 この中でも私みたいなへなちょこJavaプログラマーに効きそうな機能はこんなところかな?

イケイケなJava9の機能

  • moduleシステム導入
  • jshellとかいうREPLツール導入
  • StreamAPI強化!!

まぁほかにもJVMのロギングの対応とか、Unicode8とか、Http2とか、乱数ジェネの強化とか、SHA3とか、非推奨GCが出たり、ファイナライザ変更とか、LocalDateTime強化とか、AOTコンパイラツールとかいっぱいあるんで、好きな人はJEP読んで。

Moduleシステム

Javaに新しい構文が追加された。 拡張子が.javaなだけのJavaじゃないコード誕生。

これまでJava類似機能をパッケージという単位でまとめ、それらを圧縮ファイルにしてライブラリ(JAR)として提供していました。 

適当なjarファイルを落としてきて使うっていう便利な機能ですね。

これは便利なんですが課題がありました。

  • 可視性の設定が十分でなく、ライブラリ内部の機能を公開してしまう
  • ライブラリの依存性の定義がないため、不足ライブラリがあったら探し出して落とさなきゃいけない

こんなところ。 

jarを適当に落としてきて使ったら、依存関係ですぐに使えず、結局10個くらいjarを探し出して入れたことがある人は少なくないと思います。 某所でもこの前教授が依存関係で嵌ってぬわーんってしていました。

これらがモジュールシステムで対処可能になりました。 新しいディレクティブが追加されまくって公開とか依存関係とかを定義できるようになっています。

すごいですねModule。

module jp.ac.teu.cloud.service {

}

こんな記法からmoduleの設定ができますよ。 どっかで今後この記法見ても???ってならないように気をつけないといけませんね。 ちゃんとした使い方はいろいろなところでそっちを参考に。。。

jshell

これ私みたいなへっぽこJavaプログラマーには良い機能では? javaインタプリタみたいなやつ よくrubyとかpythonとかでやれるやつ。 弊研生はJavaインタプリタつくりましたーーー!ってこのコードを全部提出して単位を貰うと良いよ。

gyazo.com

こんなもんです。

Javaは雰囲気でどんな値返ってくるかとかわかるから、試しにライブラリの関数呼んでみるみたいなことは、需要がそんなあるわけじゃない気がするんだけど。。。  やろうとしたとき一々クラスファイル書かなくてよくなったのは便利!!

gyazo.com

講義とかでちょろっと見せるのに使えるかも知れませんね。  まぁ弊学では、皆にJavaを教えたはずなのに、課題でラムダ書いたら大半が理解できなくて、おまけに老害みたいなこと言い始めたSA・TAまでいたのであれでしょうけど。。。。

StreamAPI強化

あいつがもっと強くなった。   streamapiというとこいつとか。

List.of(1,2,3,4).forEach(System.out::println)

サンプルがこれかって? 便利じゃないですか。 

List.of()っていうのはJava9で追加された子です。 ついにこいつができた!。 今までよくstatic finalなリストやマップに、staticイニシャライザで値を突っ込んで、よく分かってない人からなんですかこの構文?って聞かれたことがある人は多いはず。

private static final List<String> hogeMap = new ArrayList<>(); static {
  hogeMap.add("にゃーん");
}

こんな無駄なことをしなくてもいい。

List<Integer> lst = new ArrayList<>() {
   public ArrayList() {
     super();
     add(1);
     add(2);
     add(3);
     add(4);
     return;
   }
}

こういうのとかもしなくていい。 あ、上のコード、Java8だとArrayListのあとのジェネリクス省略でコンパイル通らねーぞ^_^と思った人。 Java9だと匿名クラスのジェネリクスを上手い感じにしてくれるのでいけます。

ofメソッド 便利なんですが注意点が一つ、以前Arrayからのofでリストつくるとかしてた人なら分かると思うけど、できあがるのは不変リストなので、変えたい場合はこれでできた値を新しいリストのインスタンスにつっこんで使いましょう。

StreamAPI自体としては、streamインターフェースにいくつか便利なのが追加されました。 takeWhile(Predicate<? super T>)とかです。 意外と便利?

個人的にはCollectersの拡張がありがたいです。filterlingとか。 終端でフィルタを噛ませられるようになったよ。

さいご

Javaは8からの進化がいいですね。 私は進化とレガシーさの良い感じのバランスが好きです。 でも某所のJava7は無理。 マジで無理。  イケイケなひとが全部Java9にしておいてくれないかなーって。 まぁ某所がJava7のままなのは私が手を付けなかったせいでもあるので、あまり文句は言えないんですけどね。

StreamAPIの新規追加メソッドの全サンプルとか載せたかったけどちょっと日和ってしまいました、ごめんなさい。 

Javaをメインで書くことは今後減るんだろうけどずっと追い続けていきたいなーって記事書いてて思いました。

明日の田胡研アドベントカレンダーは期待の3年生のfubukiくんです。 ご期待下さい。