Somurie Engineer's Blog

今更ながらJava11の新機能をまとめてみた

背景 今までJava8の案件が主だったのですが、最近Java12の案件にも参画させて頂いています。 ただ、開発している中でJava9以降の機能を使っておらず、使える機能がないかを調べる目的でまとめてみました。 今回使用するサンプルコードは以下に全て置いてあります。 https://github.com/somurieengieer/javaSelfTraining/blob/master/src/sample/java11newFunc/Java11sample.java 追加された機能 String isBlankの追加 isEmptyに加えて半角/全角スペースもtrueを返します。 (isEmptyは文字列の長さが0の場合のみtrueを返す) ※注意として、該当の変数がnullの場合はNullPointerExceptionを投げます。nullの場合もtrueを返してほしい場合はStringUtils.isEmpty()を使う必要があります。 Collection toArrayの追加 Collection型のクラスにtoArrayメソッドが追加されました。メソッド名の通り配列に変換して値を返します。 Optional isEmptyの追加 isPresentの逆の値を返すメソッドとしてisEmptyメソッドが追加されました。 !を使わなくてもよくなりますね。 Predicate notの追加 Predicateで記述された条件結果の否定結果を返します。 notの引数はPredicate <? super T>、返り値はPredicateです。 HTTP/2のサポート HTTP/2に対応しました。java.net.http.HttpClientなどが追加され、単純な外部Webサーバへのアクセスは以下のようにやります。簡単です。 単一Javaファイルの即時実行 単一のJavaファイルをコンパイルなしで即時実行できるようになりました。私はあまり使う機会はなさそうです。 具体的なコマンドは以下の通りです。 新しいガベージコレクション方式 ZGCという新しいガベージコレクションが追加。コンカレントGCであり、アプリケーションと平行して動作し、GCの停止時間を10ms以下にすることを目標に開発されているようです。 Linux/x64環境のみをサポートしています(Java13でLinux/A Arch64もサポートしそう)。 Java9でデフォルトGCがG1GCになりましたが、マシン性能が高い環境で動作することを前提とした仕組みになってきていますね。 ZGCの詳細は以下リンク先を参照ください。 https://wiki.openjdk.java.net/display/zgc/Main Javaモニタリング機能の追加 FlightRecorderというモニタリング機能が追加されました。厳密には有償版には以前から存在していたようですが、無償版になったようです。 現時点で私は不要ですが頭の片隅に置いておいたほうが良さそうです。 所感 Java10に引き続き大きな仕様変更はありませんでした。 機能面は成熟度が増しており、複雑化する運用に対するサポート機能にも力を入れることができる状態にあるように感じました。 Java8以来のLTSになるため、Java9〜11の機能はセットで覚えておいても良さそうです。

今更ながらJava10の新機能をまとめてみた

背景 今までJava8の案件が主だったのですが、最近Java12の案件にも参画させて頂いています。 ただ、開発している中でJava9以降の機能を使っておらず、使える機能がないかを調べる目的でまとめてみました。 今回使用するサンプルコードは以下に全て置いてあります。 https://github.com/somurieengieer/javaSelfTraining/blob/master/src/sample/java10newFunc/Java10sample.java 追加された機能 var型の追加 新しい型としてvar型が追加されました。型推論という機能を使って、コンパイル時に右辺の値から型を決定することができます。 略式記述(シンタックスシュガー)です。 List copyOfメソッドの追加 Listを複製する。複製したListは修正不可(追加・削除不可)だが、各要素が参照しているオブジェクト内は修正可能であるため注意。 Optional orElseThrow()の追加 Optionalの値が存在すれば値を返し、nullの場合には例外をスローします。 デフォルトではNoSuchElementExceptionを返却し、引数にExceptionを設定することにより変更することも可能です。 所感 今回ピックアップする項目が少なかったです。半年毎のリリースになるとさすがに少なくなりますね。 varについてはまずは単体テスト等で積極的に使っていきたいと思います。List.copyOfはJava9に続いてイミュータブル化推進されている感じがしますね。

今更ながらJava9の新機能をまとめてみた

背景 今までJava8の案件が主だったのですが、最近Java12の案件にも参画させて頂いています。 ただ、開発している中でJava9以降の機能を使っておらず、使える機能がないかを調べる目的でまとめてみました。 今回使用するサンプルコードは以下に全て置いてあります。 https://github.com/somurieengieer/javaSelfTraining/blob/master/src/sample/java9newFunc/Java9sample.java 追加された機能 BigInteger sqrt()の追加 BigIntegerで平方根取得のメソッドが追加されました。四捨五入するようで、√2は1を返します。 Optional、Stream ifPresentOrElse()の追加 Java8で追加されたOptional、Streamですが、Java9以降にいくつかメソッドが追加されているようです。Java8が展開された後に不足していた機能を充足するメソッド追加のようです。 ifPresentOrElse()ではOptionalの値が存在する場合としない場合の処理をまとめて記載することができます。 streamNullFilter()の追加 Optionalのstream処理をする際に、値がnullの項目を排除することができます。 or()の追加 値がnullの場合に返す値を定義することができます。 takeWhile()の追加 streamに対する中間操作として使われます。streamの先頭から条件処理結果がfalseになるまでの値を返します。 dropWhile()の追加 takeWhile()とは逆に、streamの先頭から条件処理結果がtrueの間の値を削除したstreamを返します。 List of()の追加 Listの静的なファクトリメソッド。イミュータブルであるため扱いに注意。 モジュール機能 モジュールの概念が追加されました。 外部へ公開するpackageと公開しないpackageを区別することができ、公開している想定のないpackageへの意図しないアクセスを制限することができます。 以下の通り、外部へ公開するpackageを指定することができます。 使用用途はこちらの記載がわかりやすかったです。 jshell機能の追加 Javaを対話型で実行するためのツールです。以下のように起動することができます。 ガベージコレクションのデフォルトがG1に変更 ガベージコレクションには以下の種類があります。 シリアルGC パラレルGC CMS G1GC シングルコア環境ではシリアルGCがデフォルト、マルチコア環境ではパラレルGCがデフォルトでした。 Java9からはG1GCがデフォルトになります。(明確な情報が見つかりませんでしたが CMSとG1GCがコンカレントGCであるため、マシン性能が求められます。ある程度スケールアップ/スケールアウトできる環境が当たり前になってきたことがデフォルト値変更の背景かもしれません。 ちなみにJava11が例ですが、以下サイトによると低スペックマシンでは引き続きシリアルGCが動くようです。 G1GCがデフォルトなのはマルチコア環境のみっぽいですね。業務で必要になったら詳細に調べる必要がありそうです。 https://matsumana.info/blog/2018/12/09/java11-g1gc-default/ 所感 Java8の新機能として追加されたOptional、Streamに関する機能追加が多かったですね。Java8の機能で代替できるものなので取り急ぎ必要なものは少ないです。 List.of(…)はかなり多用しそうですね。イミュータブル推しの流れが来ているのでしょうか。 ちなみに、日付に関する以下はJava8から追加されたようです。Java9以降かと思ってたけど違いました。 ・LocalDate ・LocalDateTime ・DateTimeFormatter