Java 9:什么是集合工厂方法? [英] Java 9: What are collection factory methods?
问题描述
Java 9的到来为Java的Collections API带来了许多新功能,其中一个是集合工厂方法。
The arrival of Java 9 brings many new features to Java's Collections API, one of which being collection factory methods.
它们是什么以及如何正确实现它们?
What are they and how can I implement them properly?
推荐答案
注1:为防止使用原始类型,我选择提供我在下面提到的每个类的泛型类型,使用 E
,表示 Collection< E>
的元素。
注2:这个答案可能会有所变化;如果发生拼写错误,请编辑此帖子。
Java中的集合工厂方法是一种静态方法,它提供了一种初始化不可变 集合< E>
的简单方法。
A collection factory method in Java is a static method that provides a simple way of initializing an immutable Collection<E>
.
不可变,在集合< E>
中无法添加,删除或修改任何元素在初始化之后。
Being immutable, no elements can be added to, removed from, or modified inside the Collection<E>
after it is initialized.
使用Java 9,为以下接口提供了集合工厂方法: List< E>
,设置< E>
,地图< K,V>
With Java 9, collection factory methods are provided for the following interfaces: List<E>
, Set<E>
, and Map<K, V>
直到Java 9,没有简单的通用方法来初始化集合< E>
包含初始元素/键值条目。以前,开发人员需要按如下方式初始化它们(假设通用类型 E
, K
和 V
已替换为整数
):
Up until Java 9, there has been no simple, universal method to initialize a Collection<E>
with initial elements/key-value entries. Previously, developers were required to initialize them as follows (assuming the generic types E
, K
, and V
have been replaced with Integer
):
-
List< Integer>
- 以下方法可以说是最简单的初始化
List< Integer>
包含初始元素,但结果只是List< Integer>
的视图;我们无法添加或删除此列表<整数>
,但我们仍然可以使用List#set修改现有元素
。
-
List< Integer> list = Arrays.asList(1,2,3,4,5);
List<Integer>
- The following method is arguably the simplest to initialize a
List<Integer>
with initial elements, however the result is simply a view of aList<Integer>
; we are unable to add to or remove from thisList<Integer>
, but we are still able to modify existing elements by usingList#set
.List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
-
List< Integer> mutableList = new ArrayList<>(Arrays.asList(1,2,3,4,5));
List<Integer> mutableList = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5));
-
设置<整数>
需要更多代码来初始化初始元素而不是列表<整数>
呢(视为使用初始元素初始化Set< Integer>
需要List< Integer>
,如下所示。
-
设置<整数> mutableSet = new HashSet<>(Arrays.asList(1,2,3,4,5));
- A
Set<Integer>
required more code to initialize with initial elements than aList<Integer>
does (seeing as aList<Integer>
is required to initialize aSet<Integer>
with initial elements), which can be seen below.Set<Integer> mutableSet = new HashSet<>(Arrays.asList(1, 2, 3, 4, 5));
- A
Map< Integer,Integer>
可以说是使用初始键值条目初始化最复杂的;但是,有多种方法可以解决这个问题。
- 一种方法是首先初始化一个空的
Map< Integer,Integer>
并简单地调用Map #put
添加键值条目。 - 另一种方法是使用带有两个花括号的匿名类,这仍然需要
要调用的地图#put
。
- A
Map<Integer, Integer>
is arguably the most complicated to initialize with initial key-value entries; however, there are multiple ways to go about it.- One method was to first initialize an empty
Map<Integer, Integer>
and simply callMap#put
to add key-value entries. - Another method was to use an anonymous class with two curly braces, which would still require
Map#put
to be called.
我认为集合工厂方法为开发人员提供了一种简洁的方法初始化
列表< E>
,设置< E>
或Map< K,带有初始元素/键值条目的V>
,可以通过以下示例看到。I argue that collection factory methods provide the developer with a concise method of initializing a
List<E>
,Set<E>
, orMap<K, V>
with initial elements/key-value entries, which can be seen by the examples below.为简单起见,这些示例将替换泛型类型
E
,K
,V
,整数
。For simplicity, these examples will replace the generic types
E
,K
, andV
withInteger
.-
列表<整数>
-
Lis T<整数> list = List.of();
- 初始化一个空的,不可变的
List< Integer>
。
List<Integer>
List<Integer> list = List.of();
- Initializes an empty, immutable
List<Integer>
.
- 初始化不可变的
列表<整数>
包含一个元素。
- Initializes an immutable
List<Integer>
with one element.
- 初始化不可变的
列表<整数>
包含两个元素。
- Initializes an immutable
List<Integer>
with two elements.
- 初始化不可变的
列出<整数>
,包含可变数量的元素。
- Initializes an immutable
List<Integer>
with a variable amount of elements.
-
设置< ;整数> set = Set.of();
- 初始化一个空的,不可变的
Set< Integer>
。
Set<Integer> set = Set.of();
- Initializes an empty, immutable
Set<Integer>
.
- 初始化不可变
Set< Integer>
包含一个元素。
- Initializes an immutable
Set<Integer>
with one element.
- 初始化一个不可变的
Set< Integer>
包含两个元素。
- Initializes an immutable
Set<Integer>
with two elements.
- 初始化不可变的
使用可变数量的元素设置<整数>
。
- Initializes an immutable
Set<Integer>
with a variable amount of elements.
-
Map< Integer,Integer> map = Map.of();
- 初始化一个空的,不可变的
Map< Integer,Integer>
。
Map<Integer, Integer> map = Map.of();
- Initializes an empty, immutable
Map<Integer, Integer>
.
- 初始化一个不可变的
Map< Integer,Integer> ;
带一个键值输入。 - 注意,键是
1
,值为2
。
- Initializes an immutable
Map<Integer, Integer>
with one key-value entry. - Note that the key is
1
and the value is2
.
- 初始化一个不可变的
Map< ;带有两个键值条目的整数,整数>
。 - 请注意,键是
1
和3
,值为2
和4
。
- Initializes an immutable
Map<Integer, Integer>
with two key-value entries. - Note that the keys are
1
and3
and the values are2
and4
.
- 使用可变数量的键值条目初始化一个不可变的
Map< Integer,Integer>
。
- Initializes an immutable
Map<Integer, Integer>
with a variable amount of key-value entries.
正如您所看到的,这种新的初始化方法需要的代码少于其前辈。
As you can see, this new method of initialization requires less code than its predecessors.
集合<由集合工厂方法创建的E>
本质上是不可变的,但是我们能够将它们传递给集合< E>
的实现的构造函数产生一个可变版本:The
Collection<E>
created by collection factory methods are inherently immutable, however we are able to pass them to a constructor of an implementation of theCollection<E>
to produce a mutable version:-
List< Integer>
-
List< Integer> mutableList = new ArrayList<>(List.of(1,2,3,4,5));
List<Integer>
List<Integer> mutableList = new ArrayList<>(List.of(1, 2, 3, 4, 5));
-
设置<整数> mutableSet = new HashSet<>(Set.of(1,2,3,4,5));
Set<Integer> mutableSet = new HashSet<>(Set.of(1, 2, 3, 4, 5));
-
Map< Integer ,整数> mutableMap = new HashMap<>(Map.of(1,2,3,4));
Map<Integer, Integer> mutableMap = new HashMap<>(Map.of(1, 2, 3, 4));
这篇关于Java 9:什么是集合工厂方法?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
-
- Initializes an empty, immutable
- 初始化一个空的,不可变的
- Initializes an empty, immutable
- 初始化一个空的,不可变的
- Initializes an empty, immutable
- 初始化一个空的,不可变的
-
- One method was to first initialize an empty
- 一种方法是首先初始化一个空的
-
- The following method is arguably the simplest to initialize a
-
- 以下方法可以说是最简单的初始化