きっかけ
前書いた記事と同じ
環境準備も以前の記事を参照
環境準備の補足
Kitematicの Setting > Volumes を選択して、LOCAL FOLDER をバインドさせたいフォルダに指定する。
お好みだが、自分は、~/dev/notebooks
を指定した。
指定したら、念のためにコンテナを再起動する。
そうすると、HOME > WEB PREVIEW にコンテナの内容が表示される。
クリックすると、Webブラウザが立ち上がり、コンテナのファイル操作のためのサービスが立ち上がる。
不変コレクション
やっと本題。
Javaで不変コレクションを作成する場合、かなり手間があった。
実装するとなると、下記のような実装になるはず。
import java.util.ArrayList; import java.util.Collections; import java.util.List; public class SampleList { public static void main(String[] args) { List<String> list = new ArrayList<>(); list.add("武藤遊戯"); list.add("遊城十代"); list.add("不動遊星"); list.add("九十九遊馬"); list.add("榊遊矢"); list = Collections.unmodifiableList(list); System.out.println(list); } }
実行すると、下記のように表示される。
[武藤遊戯, 遊城十代, 不動遊星, 九十九遊馬, 榊遊矢]
試しに、要素を追加してみる。
ソースは下記の通り。
import java.util.ArrayList; import java.util.Collections; import java.util.List; public class SampleList { public static void main(String[] args) { List<String> list = new ArrayList<>(); list.add("武藤遊戯"); list.add("遊城十代"); list.add("不動遊星"); list.add("九十九遊馬"); list.add("榊遊矢"); list = Collections.unmodifiableList(list); list.add("藤木遊作"); } }
不変リストなので要素追加できるわけはなく、下記のように実行時エラーになる。
コンパイルエラーに知れくれてもいい気はするが、話を進める。
Exception in thread "main" java.lang.UnsupportedOperationException at java.util.Collections$UnmodifiableCollection.add(Collections.java:1055) at SampleList.main(SampleList.java:16)
復習はココまで。
実際に、使うことは多い。
不変のコレクションを定数として使いたい場合がたまにあるので、知らなかった人はきちんと覚えておいたほうが良い。
Java9からの不変コレクション(List/Map/Set)
不変リスト
List<String> list = List.of("abc", "def");
この一行でOK。
試しに要素を追加してみる。
下記のソースで実施。
-> List<String> list = List.of("abc", "def") | Added variable list of type List<String> with initial value [abc, def] -> list.add("Wryyyyyy!") | java.lang.UnsupportedOperationException thrown | at Collections$UnmodifiableCollection.add (Collections.java:1056) | at (#10:1)
追加できない!
ちゃんとできている。
これで、楽に定数宣言できる。
残りのコレクションも同様に紹介
不変マップ
Map<Integer, String> map = Map.of(1, "abc", 2, "def")
不変セット
Set<String> set = Set.of("abc", "def")
感想
とても簡単になった。
Guavaに近い形らしいが、使ったことないので、分からん!