Java
 Computer >> コンピューター >  >> プログラミング >> Java

Java 9で不変コレクションを初期化する方法!List.of()・Set.of()・Map.of()の使い方

Java 9のファクトリメソッドによる不変コレクションの作成

Java 9では、ListSetMapの各インターフェースに静的ファクトリメソッドが追加され、不変(イミュータブル)なコレクションを非常に簡単に作成できるようになりました。空のコレクションでも要素を持つコレクションでも、たった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

実行結果を見ると、SetMapの出力順序が挿入順と異なることが確認できます。これは、これらの不変コレクションが要素の順序を保証しないためです。一方で、List.of()で生成したリストは挿入順が維持されます。Java 9以降のプロジェクトでは、簡潔で安全な不変コレクションの生成手段として、これらのファクトリメソッドを積極的に活用しましょう。

  1. JavaでJSONArrayをJSONObjectに追加する方法を解説

    JSON(JavaScript Object Notation)は、データ交換に広く使われているテキストベースのフォーマットです。軽量でありながら言語に依存しないという特徴を持つため、多くのプログラミング環境で採用されています。 Javaでは、JSONArray(JSON配列)をJSONObject(JSONオブジェクト)に追加することができます。手順は以下の通りです。 JSONArrayをJSONObjectに追加する手順 ArrayListなどのリストに要素を追加します。 そのリストの内容をJSONArrayクラスのput()メソッドを使って配列に格納します。 最後に、作成したJSONA

  2. 【Java】CollectionインターフェースとCollectionsクラスの違いとは?違いを徹底解説

    はじめにJavaのコレクションフレームワークを学んでいると、「Collection」と「Collections」という名前が似ている2つの存在に出会います。名前はほぼ同じですが、その役割はまったく異なります。この記事では、両者の違いをわかりやすく解説します。CollectionとCollectionsの主な違いCollectionはJavaにおけるインターフェースです。一方、Collectionsはユーティリティクラスであり、コレクションを操作するための便利な静的メソッドを提供します。Set、List、QueueなどはCollectionインターフェースのサブインターフェースです。また、Map