了解Java9的特点--集合API的改进与实例。
Java9集合API的改进
Java9对java.util.List、java.util.Map、java.util.Set接口增加了一些小的API改动。
增加了新的静态工厂方法 -of(collection) ,并按迭代顺序返回未修改的集合 -List 、Set 和Map 。
该方法接受一个参数列表作为输入,并分别返回未经修改的List,Set 和Map 的集合。
在java8中创建一个未修改的集合的不同方法?
在java9版本之前,我们有很多方法可以为一些数据项创建一个未修改的集合。
下面的部分包含了创建未修改的集合的各种方法和例子。对于这些例子,以列表为样本,同样的过程我们可以改编为定义和声明Set 和Map 。
- 简单的未修改的集合创建
创建一个元素很少的未修改的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的变化
List 和Set 都有重载的 of() 方法,参数为0到10。 List和 Set 的语法和签名都是一样的。
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)
像List 和Set ,Map 也有一个版本的可变参数方法
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的变化和例子。