Java中如何快捷的建立不可變集合

程式猿DD發表於2022-05-31

在Java 9中又新增了一些API來幫助便捷的建立不可變集合,以減少程式碼複雜度。

本期配套視訊:Java 9 新特性:快速定義不可變集合

常規寫法

以往我們建立一些不可變集合的時候,通常是這樣寫的:

// 不可變的Set
Set<String> set = new HashSet<>();
set.add("a");
set.add("b");
set.add("c");
set = Collections.unmodifiableSet(set);

// 不可變的List
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list = Collections.unmodifiableList(list);

Java8的寫法

在Java 8的時候,利用Stream API還能簡化一下,可以演變成這樣:

Set<String> set = Collections.unmodifiableSet(Stream.of("a", "b", "c").collect(toSet()));
List<Integer> list = Collections.unmodifiableList(Stream.of(1, 2, 3).collect(toList()));

Java9的寫法

而現在到了Java 9,這一操作變的更為簡單,只需要這樣:

Set<String> set = Set.of("a", "b", "c");
List<Integer> list = List.of(1, 2, 3);

同時,對於一下更復雜的集合也一樣支援,比如Map型別也可以這樣寫:

Map<String, String> map = Map.of("a", "1", "b", "2", "c", "3");

就是要注意下,Map.of的引數是key和value成對出現的,所以引數數量一定是偶數:

Map.of()
Map.of(k1, v1)
Map.of(k1, v1, k2, v2)
Map.of(k1, v1, k2, v2, k3, v3)
...

與asList的區別

看到這裡,可能有的人會問了,之前不是對於集合有asXxx這樣的方便方法了麼?他們有啥區別嗎?

這裡就以List.ofArrays.asList為例,給大家列一下它們的異同:

  1. Java 9中推出List.of建立的是不可變集合,而Arrays.asList是可變集合
  2. List.ofArrays.asList都不允許add和remove元素,但Arrays.asList可以呼叫set更改值,而List.of不可以,會報java.lang.UnsupportedOperationException異常
  3. List.of中不允許有null值,Arrays.asList中可以有null值

好了,今天的分享就到這裡!

如果您學習過程中如遇困難?可以加入我們超高質量的技術交流群,參與交流與討論,更好的學習與進步!
本文收錄在了我正在連載的《Java新特性專欄》,該系列該用電子書的方式編寫,如果想要沉浸式閱讀學習的話,可以訪問Web版本:https://www.didispace.com/jav...

https://www.didispace.com/java-features/

歡迎關注我的公眾號:程式猿DD。第一時間瞭解前沿行業訊息、分享深度技術乾貨、獲取優質學習資源

相關文章