Java9 - 集合API实例|新的java特性

155 阅读4分钟

了解Java9的特点--集合API的改进与实例。

Java9集合API的改进

Java9对java.util.Listjava.util.Mapjava.util.Set接口增加了一些小的API改动。

增加了新的静态工厂方法 -of(collection) ,并按迭代顺序返回未修改的集合 -ListSetMap

该方法接受一个参数列表作为输入,并分别返回未经修改的List,SetMap 的集合。

在java8中创建一个未修改的集合的不同方法?

在java9版本之前,我们有很多方法可以为一些数据项创建一个未修改的集合

下面的部分包含了创建未修改的集合的各种方法和例子。对于这些例子,以列表为样本,同样的过程我们可以改编为定义和声明SetMap

  • 简单的未修改的集合创建

创建一个元素很少的未修改的List、Set或Map是一项繁琐的工作,不必要的对象被创建。

首先,你需要创建一个列表对象,然后构造对象/元素,将它们分配给一个局部变量,通过多次调用add(如果是List)方法来添加这个元素,如果是Set和Map的话,最后将普通列表转换为未修改的列表。

List list = new ArrayList<>();    
list.add("one");              
list.add("two");  
list = Collections.unmodifiableList(list);  

  • 复制构造函数 未修改的集合创建

这是另一种使用Arrays.asList 方法创建列表的方法。并使用ArrayList 构造函数转换为列表。

List stringList = Collections.unmodifiableList(  
new ArrayList<>(Arrays.asList("one", "two")));
  • 使用Double Brace语法创建未修改的集合

在这个例子中,使用匿名的内部类与实例在双括号中创建。

List strList = Collections.unmodifiableList(new ArrayList<>() {{  
add("one"); add("two"); add("three");  
}});  

  • 使用流的Java8未修改的集合

使用Stream.of() 方法将字符串阵列转换为Stream ,使用收集ors.toList() 方法将stream 转换为List

List strLists = Collections.unmodifiableList(  
Stream.of("one", "two", "three").collect(Collectors.toList()));  

使用java9,我们可以很容易地创建一个未修改的集合。

我们将在下面的例子中看到。

java9中集合API的变化

ListSet 都有重载的 of() 方法,参数为0到10。 ListSet 的语法和签名都是一样的。

static  List of()  
static  List of(E e1)  
static  List of(E e1,E e2)  
// ..... so on upto ten parameters  
static  List of(E... e) // variable arguments  
static  Set of()  
static  Set of(E e1)  
static  Set of(E e1,E e2)  
// ..... so on upto ten parameters  
static  Set of(E... e) // variable arguments  

map 也有零到10个参数的静态方法。

static  Map of(K k1, V v1, K k2, V v2, K k3, V v3) 

ListSetMap 也有一个版本的可变参数方法

static  Map ofEntries(Map.Entry... entries)

List.of()工厂静态方法示例

创建一个列表很简单,代码也很短。

它需要三个元素作为输入并返回大小为3的列表。由于这个方法是重载的,有10个参数,你最多可以提供10个元素。

如果需要插入更多的元素,你可以使用一个方法的可变参数版本。

List strList = List.of("one", "two", "three","four");

Set.of() 工厂静态方法示例

Set. of()方法接受三个参数作为输入并返回一个未修改的集合。

Set stringSet = Set.of("set1", "set2", "set3");  

这个方法of() ,不会允许重复的元素,重复的元素会抛出java.lang.IllegalArgumentException:重复的元素。

Set.of("one", "two", "three", "one");  

上述代码的输出是

 Exception in thread "main" java.lang.IllegalArgumentException: duplicate element: one  
 at java.base/java.util.ImmutableCollections$SetN.(ImmutableCollections.java:463)  
 at java.base/java.util.Set.of(Set.java:521)  
 at org.cloudhadoop.datetime.LamdaExpressionThisExample.main(LamdaExpressionThisExample.java:41)

Map.of() 工厂静态方法示例

这个接口有两个方法of和ofEntries ,用于创建集合。

Map mapDemo = Map.of(1, "one", 2, "two", 3, "three");  
 // variable arguments example  
Map map = Map.ofEntries(  
new AbstractMap.SimpleEntry<>("key1", "value1"),  
new AbstractMap.SimpleEntry<>("key2", "value2"),  
new AbstractMap.SimpleEntry<>("key3", "value3"));  

重复的键

of() 向Map传递Duplicate keys,抛出java.lang.IllegalArgumentException:重复键异常

Map.of("one", "value1", "one", "value2");  

并输出

Exception in thread "main" java.lang.IllegalArgumentException: duplicate key: one  
at java.base/java.util.ImmutableCollections$MapN.(ImmutableCollections.java:681)  
at java.base/java.util.Map.of(Map.java:1327)  
at org.cloudhadoop.datetime.LamdaExpressionThisExample.main(LamdaExpressionThisExample.java:41)  

未修改的集合 - java.lang.UnsupportedOperationException 异常

Set strSet = Set.of("one", "two");  
strSet.add("three");  

输出是

Exception in thread "main" java.lang.UnsupportedOperationException  
at java.base/java.util.ImmutableCollections.uoe(ImmutableCollections.java:71)  
at java.base/java.util.ImmutableCollections$AbstractImmutableSet.add(ImmutableCollections.java:281)  
at org.cloudhadoop.datetime.LamdaExpressionThisExample.main(LamdaExpressionThisExample.java:39)  

未修改的集合 不接受空值的java9

方法不接受空值。

Set.of("one", "two", null);  
ist.of("one", "two", null);  

输出

Exception in thread "main" java.lang.NullPointerException  
at java.base/java.util.Objects.requireNonNull(Objects.java:221)  
at java.base/java.util.ImmutableCollections$ListN.(ImmutableCollections.java:234)  
at java.base/java.util.List.of(List.java:842)  
at org.cloudhadoop.datetime.LamdaExpressionThisExample.main(LamdaExpressionThisExample.java:39)  

如果Null值作为Map的键或值传递,则抛出java.lang.UnsupportedOperationException

Set strSet = Set.of("one", "two");  
strSet.add("three");  

输出

Exception in thread "main" java.lang.UnsupportedOperationException  
at java.base/java.util.ImmutableCollections.uoe(ImmutableCollections.java:71)  
at java.base/java.util.ImmutableCollections$AbstractImmutableSet.add(ImmutableCollections.java:281)  
at org.cloudhadoop.datetime.LamdaExpressionThisExample.main(LamdaExpressionThisExample.java:39)  

集合工厂静态方法的特点

  • 它返回未修改的集合
  • 如果元素被序列化,返回的集合也会被序列化
  • Map中不允许出现空的键和值
  • 在List和Set中不允许有空值
  • 这些集合是不可变的,任何可变的方法(从集合中添加/修改/删除元素)都会引发不支持的操作异常。
  • 在Set中不允许有重复的元素,而且排序是无序的
  • 列表允许重复,但返回的集合是基于原始插入顺序的。
  • 这些静态方法不能被重写。我们不能使用子类实现或实例类型来使用它们。它们只能用接口名称来调用。

总结

在本教程中,学习了java9集合API的变化和例子。