Java 9:什么是集合工厂方法? [英] Java 9: What are collection factory methods?

查看:155
本文介绍了Java 9:什么是集合工厂方法?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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 a List<Integer>; we are unable to add to or remove from this List<Integer>, but we are still able to modify existing elements by using List#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 a List<Integer> does (seeing as a List<Integer> is required to initialize a Set<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 call Map#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>, or Map<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, and V with Integer.


                  • 列表<整数>


                    • 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 is 2.

                                  • 初始化一个不可变的 Map< ;带有两个键值条目的整数,整数>

                                  • 请注意,键是 1 3 ,值为 2 4

                                  • Initializes an immutable Map<Integer, Integer> with two key-value entries.
                                  • Note that the keys are 1 and 3 and the values are 2 and 4.

                                  • 使用可变数量的键值条目初始化一个不可变的 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 the Collection<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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆