Java10中集合的API库变化介绍

111 阅读2分钟

Java10集合API的新增内容

Java10引入了对java.util.List、java.util.Map、java.util.Set的API修改。

增加了新的静态工厂方法 - copyOf(collection),并按迭代顺序返回未修改的集合 - List、Set和Map。

在这篇博文中,我们将介绍Java10中集合的API库变化

语法

static <E> List<E> copyOf​(Collection<? extends E> coll)  
static <K,V> Map<K,V> copyOf​(Map<? extends K,? extends V> map)  
static <E> Set<E> copyOf​(Collection<? extends E> coll)  

它是一个元素的集合,在这个集合上,添加/删除/更新等突变器方法不会像预期的那样工作,抛出UnSupportedOperationException
如果集合为空或者任何元素包含空值,这些方法会抛出NullPointerException。
它允许使用此方法将集合复制到其他集合中。如果集合被修改,返回的列表将不会得到修改后的变化。因为这只是对一个集合进行浅层克隆

Java.util.list.copyOf(collection)方法实例

我们将看到这样一个例子:如何从现有列表中克隆/复制单独的列表?
创建了一个有重复元素的列表。
返回的列表包含相同的顺序,就像提供一个插入顺序的列表。它允许重复的元素。

List stringList = new ArrayList<>();  
stringList.add("one");  
stringList.add("two");  
stringList.add("two");  
stringList.add("three");  
List newStringList = List.copyOf(stringList);  
newStringList.stream().forEach(System.out::println);  

上述代码的输出是

one  
two  
two  
three  

Java.util.Set.copyOf(collection)方法示例

我们将看到这个例子:如何从现有的列表中克隆/复制单独的集合?
创建了一个有重复元素的列表。
,返回的集合包含了不允许重复的元素。顺序不被保证。

List stringList = new ArrayList<>();  
stringList.add("one");  
stringList.add("two");    
stringList.add("two");        
stringList.add("three");         
Set newStringList = Set.copyOf(stringList);  
newStringList.stream().forEach(System.out::println);  

上述代码执行的输出是

one  
three  
two  

Java.util.Map.copyOf(collection)方法实例

我们将看到这样一个例子:如何从现有的Map中克隆/复制单独的Map?
创建了一个具有重复键元素的Map。
,返回的Map包含不允许重复的键。顺序是基于散列算法的。

Map mapString = new HashMap<>();  
mapString.put("key1","value1");  
mapString.put("key2","value2");  
mapString.put("key2","value23");  
mapString.put("key3","value3");  
Map newMapString = Map.copyOf(mapString);  
System.out.println(newMapString);

上述代码执行的输出是

{key3=value3, key1=value1, key2=value23}  

copyOf UnsupportedOperationException 异常示例

copyOf方法返回未修改的集合,修改集合中的元素会抛出UnsupportedOperationException

import java.util.ArrayList;  
import java.util.List;  
public class TestInterface {  
 public static void main(String[] args) {  
  List stringList = new ArrayList<>();  
  stringList.add("one");  
  stringList.add("two");  
  stringList.add("two");  
  stringList.add("three");  
  modifyCollection(List.copyOf(stringList));  
 }  
 public static void modifyCollection(List strings) {  
  strings.set(0, "newone");  
 }  
}  

输出是

Exception in thread "main" java.lang.UnsupportedOperationException  
 at java.base/java.util.AbstractList.set(AbstractList.java:136)  
 at org.cloudhadoop.datetime.TestInterface.modifyCollection(TestInterface.java:49)  
 at org.cloudhadoop.datetime.TestInterface.main(TestInterface.java:24)  

copyOf的注意事项和特点

  • 集合返回未修改的集合。集合中的元素不能被添加/删除/修改。如果集合试图修改它,它会抛出UnsupportedOperationException
  • 不允许空元素或空集合,试图对空元素进行处理,会抛出NullPointerException
  • 如果元素被序列化了,返回的集合也被序列化了
  • 返回的集合顺序与提供的集合相同
  • 这些都是静态方法,所以你是用接口而不是对象来调用它们。