JAVA9新特性,集合工廠方法
阿新 • • 發佈:2017-10-16
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新特性,集合工廠方法