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
- 如果元素被序列化了,返回的集合也被序列化了
- 返回的集合顺序与提供的集合相同
- 这些都是静态方法,所以你是用接口而不是对象来调用它们。