原文: https://howtodoinjava.com/java9/create-immutable-collections-factory-methods/
学习使用新的创建不可变集合,例如不可变列表,不可变集和不可变映射 Java 9 中的工厂方法。
Table of ContentsCreate Immutable ListCreate Immutable SetCreate 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)//varargsstatic <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 orderSystem.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)//varargsstatic <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 fixedSystem.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 中创建不可变集合的新工厂方法具有很高的可读性和易用性。
请在评论部分中将您对这些不可变集合的观点放下。
学习愉快!
