Java 9 中的不可变集合和工厂方法
Java 9 中的不可变集合和工厂方法
学习使用新的创建不可变集合,例如不可变列表,不可变集和不可变映射 Java 9 中的工厂方法。
Table of Contents
Create Immutable List
Create Immutable Set
Create Immutable Map
创建不可变列表
使用List.of()
静态工厂方法创建不可变列表。 它具有以下不同的重载版本:
static <E> List<E> of()
static <E> List<E> of(E e1)
static <E> List<E> of(E e1, E e2)
static <E> List<E> of(E e1, E e2, E e3)
static <E> List<E> of(E e1, E e2, E e3, E e4)
static <E> List<E> of(E e1, E e2, E e3, E e4, E e5)
static <E> List<E> of(E e1, E e2, E e3, E e4, E e5, E e6)
static <E> List<E> of(E e1, E e2, E e3, E e4, E e5, E e6, E e7)
static <E> List<E> of(E e1, E e2, E e3, E e4, E e5, E e6, E e7, E e8)
static <E> List<E> of(E e1, E e2, E e3, E e4, E e5, E e6, E e7, E e8, E e9)
static <E> List<E> of(E e1, E e2, E e3, E e4, E e5, E e6, E e7, E e8, E e9, E e10)
//varargs
static <E> List<E> of(E... elements)
这些方法创建的List
实例具有以下特征:
- 这些列表是不可变的。 不能在这些列表中添加,删除或替换元素。 调用任何可变方法(即
add
,addAll
,clear
,remove
,removeAll
,replaceAll
)将始终导致抛出UnsupportedOperationException
。 - 它们不允许
null
元素。 尝试添加null
元素将导致NullPointerException
。 - 如果所有元素都是可序列化的,它们可以可序列化的。
- 列表中元素的顺序与提供的参数或提供的数组中的元素的顺序相同。
让我们看一些使用不可变列表的例子。
package com.howtodoinjava;
import java.util.List;
public class ImmutableCollections
{
public static void main(String[] args)
{
List<String> names = List.of("Lokesh", "Amit", "John");
//Preserve the elements order
System.out.println(names);
//names.add("Brian"); //UnsupportedOperationException occured
//java.lang.NullPointerException
//List<String> names2 = List.of("Lokesh", "Amit", "John", null);
}
}
Output:
[Lokesh, Amit, John]
创建不可变集
Set
的行为与List
非常相似,只是差异很小。 例如:
Set
也不允许重复元素。 传递的任何重复元素将导致IllegalArgumentException
。- 集合元素的迭代顺序未指定,可能会发生变化。
所有Set
工厂方法都具有与List
相同的签名。
static <E> Set<E> of()
static <E> Set<E> of(E e1)
static <E> Set<E> of(E e1, E e2)
static <E> Set<E> of(E e1, E e2, E e3)
static <E> Set<E> of(E e1, E e2, E e3, E e4)
static <E> Set<E> of(E e1, E e2, E e3, E e4, E e5)
static <E> Set<E> of(E e1, E e2, E e3, E e4, E e5, E e6)
static <E> Set<E> of(E e1, E e2, E e3, E e4, E e5, E e6, E e7)
static <E> Set<E> of(E e1, E e2, E e3, E e4, E e5, E e6, E e7, E e8)
static <E> Set<E> of(E e1, E e2, E e3, E e4, E e5, E e6, E e7, E e8, E e9)
static <E> Set<E> of(E e1, E e2, E e3, E e4, E e5, E e6, E e7, E e8, E e9, E e10)
//varargs
static <E> Set<E> of(E... elements)
我们来看几个不可变集的例子。
import java.util.Set;
public class ImmutableCollections {
public static void main(String[] args) {
Set<String> names = Set.of("Lokesh", "Amit", "John");
//Elements order not fixed
System.out.println(names);
//names.add("Brian"); //UnsupportedOperationException occured
//java.lang.NullPointerException
//Set<String> names2 = Set.of("Lokesh", "Amit", "John", null);
//java.lang.IllegalArgumentException
//Set<String> names3 = Set.of("Lokesh", "Amit", "John", "Amit");
}
}
创建不可变映射
Map
工厂方法与List
或Set
重载工厂方法相同。 唯一的区别是方法的签名采用交替的键和值作为参数。 例如:
static <K,V> Map<K,V> of()
static <K,V> Map<K,V> of(K k1, V v1)
static <K,V> Map<K,V> of(K k1, V v1, K k2, V v2)
...
...
static <K,V> Map<K,V> ofEntries(Map.Entry<? extends K,? extends V>... entries)
Java 9 还提供了一种特殊的方法来创建 Map 条目实例。
static <K,V> Map.Entry<K,V> entry(K k, V v)
让我们举一个在 Java 9 中创建不可变Map
的示例。
import java.util.Map;
public class ImmutableCollections {
public static void main(String[] args) {
Map<String, String> names = Map.ofEntries(
Map.entry("1", "Lokesh"),
Map.entry("2", "Amit"),
Map.entry("3", "Brian"));
System.out.println(names);
//UnsupportedOperationException
//names.put("2", "Ravi");
}
}
Output:
{1=Lokesh, 2=Amit, 3=Brian}
显然,在 Java 9 中创建不可变集合的新工厂方法具有很高的可读性和易用性。
请在评论部分中将您对这些不可变集合的观点放下。
评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果