JAVA9新特性,集合工厂方法

通常,您希望在代码中创建一个集合(例如,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     }

 

posted @ 2017-10-16 11:36  最美镜中人  阅读(1009)  评论(0编辑  收藏  举报