Java 9で不変コレクションを初期化する方法!List.of()・Set.of()・Map.of()の使い方
Java 9のファクトリメソッドによる不変コレクションの作成
Java 9では、List・Set・Mapの各インターフェースに静的ファクトリメソッドが追加され、不変(イミュータブル)なコレクションを非常に簡単に作成できるようになりました。空のコレクションでも要素を持つコレクションでも、たった1行で初期化できるのが大きな魅力です。
Java 8以前のバージョンでは、Collections.unmodifiableList()のようなユーティリティメソッドを使って不変コレクションを作成していました。ただしこの方法では、まず可変のコレクションを生成して要素を追加し、その後でラップするという手順が必要になるため、コードが冗長になりやすいという課題がありました。
不変Listの初期化
List<Integer> immutableEmptyList = List.of();
上記のコードは、空の不変Listを生成します。
不変Setの初期化
Set<Integer> immutableEmptySet = Set.of();
上記のコードは、空の不変Setを生成します。
不変Mapの初期化
Map<Integer, Integer> immutableEmptyMap = Map.of();
上記のコードは、空の不変Mapを生成します。
不変コレクション利用時の注意点
- ファクトリメソッドで生成したコレクションに対してadd()やremove()などの変更操作を行うと、UnsupportedOperationExceptionがスローされます。
- nullの要素は許容されません。nullを渡すとNullPointerExceptionが発生します。
- Set.of()やMap.of()は要素の順序を保証しません。出力順序は必ずしも挿入順と一致しません。
- Map.of()は最大10組のキーと値まで対応しています。それ以上を扱う場合はMap.ofEntries()を使用します。
サンプルコード
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class ImmutableCollectionTest {
public static void main(String args[]) {
// Java 8以前の書き方:可変リストを生成してから不変化する
List<String> list8 = new ArrayList<String>();
list8.add("INDIA");
list8.add("AUSTRALIA");
list8.add("ENGLAND");
list8.add("NEWZEALAND");
List<String> immutableList8 = Collections.unmodifiableList(list8);
immutableList8.forEach(System.out::println);
System.out.println();
// Java 9以降の書き方:ファクトリメソッドで直接生成
List<String> immutableList = List.of("INDIA", "AUSTRALIA", "ENGLAND", "NEWZEALAND");
immutableList.forEach(System.out::println);
System.out.println();
Set<String> immutableSet = Set.of("INDIA", "AUSTRALIA", "ENGLAND", "NEWZEALAND");
immutableSet.forEach(System.out::println);
System.out.println();
Map<String, String> immutableMap = Map.of("INDIA", "India", "AUSTRALIA", "Australia", "ENGLAND", "England", "NEWZEALAND", "Newzealand");
immutableMap.forEach((key, value) -> System.out.println(key + " : " + value));
}
}
実行結果
INDIA AUSTRALIA ENGLAND NEWZEALAND INDIA AUSTRALIA ENGLAND NEWZEALAND AUSTRALIA ENGLAND NEWZEALAND INDIA AUSTRALIA : Australia ENGLAND : England NEWZEALAND : Newzealand INDIA : India
実行結果を見ると、SetやMapの出力順序が挿入順と異なることが確認できます。これは、これらの不変コレクションが要素の順序を保証しないためです。一方で、List.of()で生成したリストは挿入順が維持されます。Java 9以降のプロジェクトでは、簡潔で安全な不変コレクションの生成手段として、これらのファクトリメソッドを積極的に活用しましょう。
-
JavaでJSONArrayをJSONObjectに追加する方法を解説
JSON(JavaScript Object Notation)は、データ交換に広く使われているテキストベースのフォーマットです。軽量でありながら言語に依存しないという特徴を持つため、多くのプログラミング環境で採用されています。 Javaでは、JSONArray(JSON配列)をJSONObject(JSONオブジェクト)に追加することができます。手順は以下の通りです。 JSONArrayをJSONObjectに追加する手順 ArrayListなどのリストに要素を追加します。 そのリストの内容をJSONArrayクラスのput()メソッドを使って配列に格納します。 最後に、作成したJSONA
-
【Java】CollectionインターフェースとCollectionsクラスの違いとは?違いを徹底解説
はじめにJavaのコレクションフレームワークを学んでいると、「Collection」と「Collections」という名前が似ている2つの存在に出会います。名前はほぼ同じですが、その役割はまったく異なります。この記事では、両者の違いをわかりやすく解説します。CollectionとCollectionsの主な違いCollectionはJavaにおけるインターフェースです。一方、Collectionsはユーティリティクラスであり、コレクションを操作するための便利な静的メソッドを提供します。Set、List、QueueなどはCollectionインターフェースのサブインターフェースです。また、Map