前回は、Java SE 9での言語仕様の変更について紹介しました。今回から、標準ライブラリのうち最も基本的な「java.base」モジュールにおける新機能を紹介していきます。比較的小さな規模の変更に留まっていますが、軽視していいわけではありません。開発の現場では役に立つものも多いはずです。
java.baseモジュールの主なパッケージを以下に示します。
- java.lang
- java.io
- java.math
- java.net
- java.nio
- java.text
- java.time
- java.util
この中から、使用頻度の高い「java.util」パッケージに関連する新機能について紹介していきます。
コレクションのファクトリーメソッド
Javaのコレクションで使いにくいところに、初期化があります。例えば、"a"、"b"、"c"を要素に持つリストを作成するとしたら、リスト1のようになります。
リスト1●リストの初期化
List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
このように、要素をaddメソッドでいちいち追加しなくてはいけないのが、使いにくい点です。
リスト1の場合は、ArraysクラスのasListメソッドのようなファクトリーメソッドで上記の使いにくさは解消できます。しかし、SetインタフェースやMapインタフェースは、asListメソッドのようなファクトリーメソッドが提供されていませんでした。
また、コレクションを使う時に実装クラスを選ばなくてはいけないのも使いにくい点の1つです。リストの使用方法によってクラスを使い分ける必要があります。例えば、Listインタフェースの実装クラスとしてはArrayListクラスやLinkedListクラスなどがありますが、要素の挿入が多い場合はLinkedListクラスを使います。
しかし、CPUの処理速度も十分に速くなった現在では、以前ほど実装クラスの使い分けは必要なくなっています。パラレル処理で使用するなど特殊なケース以外は、ArrayListクラスを使えば事足りるようになっています。そこで、Java SE 9ではコレクションの初期化に使用できるファクトリーメソッドが提供されることになりました。
Java SE 8でファクトリーメソッドとしてofメソッドが使用されていましたが、コレクションでも同じです。ファクトリーメソッドは以下の3種類です。
- List.ofメソッド
- Set.ofメソッド
- Map.ofメソッド
リスト1をofメソッドで書き直したのがリスト2です。
リスト2●List.ofメソッドの使用例
List<String> list = List.of("a", "b", "c");
Arrays.asListメソッドと同様にListオブジェクトを作成できました。
Set.ofメソッドはList.ofメソッドと同様の使い方です。ただし、ofメソッドの引数に要素の重複があると、実行時にIllegalArgumentException例外がスローされます。
リスト3●Set.ofメソッドの使用例
// 要素の重複がないのでOK
Set<String> set1 = Set.of("a", "b", "c");
// 要素の重複があるためNG
Set<String> set2 = Set.of("a", "b", "a");
リスト3では前者は要素の重複がないためSetオブジェクトが生成できます。後者は"a"が重複しているため例外がスローされます。
Map.ofメソッドの引数はキー、値の順で指定します。
リスト4●Map.ofメソッドの使用例
Map<String, String> map = Map.of("a", "Apple", "b", "Banana", "c", "Caramel");