1. 程式人生 > >JAVA9新特性,集合工廠方法

JAVA9新特性,集合工廠方法

mac 代碼 ear space strac shared and port tor

通常,您希望在代碼中創建一個集合(例如,List 或 Set ),並直接用一些元素填充它。

實例化集合,幾個 “add” 調用,使得代碼重復。

1 List<String> myList = new ArrayList<String>();
2 myList.add("張三");
3 myList.add("李四");
4 myList.add("王五");
5 
6 Map<String, Integer> myMap = new HashMap<String,Integer>();
7 myMap.put("張三", 23);
8 myMap.put("李四", 24);
9 myMap.put("王五", 23);

Java 9,添加了幾種集合工廠方法:

1 List<String> myList = List.of("張三","李四","王五");
2 Set<Integer> mySet = Set.of(1,2,3);
3 Map<String, Integer> myMap = Map.of("張三",23,"李四",24,"王五",23);

除了更短和更好閱讀之外,這些方法也可以避免您選擇特定的集合實現。

事實上,從工廠方法返回已放入數個元素的集合實現是高度優化的。這是可能的,因為它們是不可變的:在創建後,繼續添加元素到這些集合會導致 “UnsupportedOperationException

” 。

這個功能在java7和java8的時候就傳說過,網上傳的是這樣的:

1 final List<Integer> piDigits = [ 1,2,3,4,5,8 ];

JDK1.7和1.8並沒有此特性,而JDK1.9也需要of();實現的。

註意:它們是不可變的,也就是說實例化後不能再進行add();會拋出“UnsupportedOperationException”。

1 List<String> list = List.of("1","2");
2 list.add("3");

那我們來看一下為什麽是不可變的。

emmm,看來不只是add()。

* Container class for immutable collections. Not part of the public API.
* Mainly for namespace management and shared infrastructure.

*用於不可變集合的容器類。不是公共API的一部分。
*主要用於命名空間管理和共享基礎設施。

搞不懂這麽做有什麽用,與直接用數組有什麽區別,有研究的朋友可以指點一下。

 1     abstract static class AbstractImmutableList<E> extends AbstractList<E>
 2                                                 implements RandomAccess, Serializable {
 3         @Override public boolean add(E e) { throw uoe(); }
 4         @Override public boolean addAll(Collection<? extends E> c) { throw uoe(); }
 5         @Override public boolean addAll(int index, Collection<? extends E> c) { throw uoe(); }
 6         @Override public void    clear() { throw uoe(); }
 7         @Override public boolean remove(Object o) { throw uoe(); }
 8         @Override public boolean removeAll(Collection<?> c) { throw uoe(); }
 9         @Override public boolean removeIf(Predicate<? super E> filter) { throw uoe(); }
10         @Override public void    replaceAll(UnaryOperator<E> operator) { throw uoe(); }
11         @Override public boolean retainAll(Collection<?> c) { throw uoe(); }
12         @Override public void    sort(Comparator<? super E> c) { throw uoe(); }
13     }

JAVA9新特性,集合工廠方法