Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java 8中实现List.of以创建不可变列表_Java - Fatal编程技术网

在Java 8中实现List.of以创建不可变列表

在Java 8中实现List.of以创建不可变列表,java,Java,从Java 9开始,List.of()可用于创建不可变列表。 我们如何在之前的版本(例如:java8)中实现相同的功能 根据问题Collections.unmodifiableList() 创建一个不可修改的视图,并且它不是不变的,因为如果您更改原始视图,它会发生更改 List.of()另一方面,创建一个不可变的副本。更改原始列表不会影响它。试试这个 @SafeVarargs public static <T> List<T> listOf(T... elements)

从Java 9开始,
List.of()
可用于创建不可变列表。 我们如何在之前的版本(例如:java8)中实现相同的功能

根据问题
Collections.unmodifiableList()

创建一个不可修改的视图,并且它不是不变的,因为如果您更改原始视图,它会发生更改

List.of()
另一方面,创建一个不可变的副本。更改原始列表不会影响它。

试试这个

@SafeVarargs
public static <T> List<T> listOf(T... elements) {
    List<T> list = new ArrayList<>();
    for (T e : elements)
        list.add(e);
    return Collections.unmodifiableList(list);
}
试试这个

@SafeVarargs
public static <T> List<T> listOf(T... elements) {
    List<T> list = new ArrayList<>();
    for (T e : elements)
        list.add(e);
    return Collections.unmodifiableList(list);
}
如果你真的是指方法,请阅读。如果你真的是这个意思,读一下这个答案

在调用集合之前实例化新列表。不可修改列表 返回仅是原始视图的对象是正确的。因此,如果原始列表发生更改,则不可修改列表也会发生更改

解决方案很简单:在传递到
集合之前,将列表复制到新的新列表中。不可修改的列表

List< Whatever > tempList = new ArrayList<>( myOriginalList ) ;  // Passing a collection to constructor of `ArrayList` creates an entirely new fresh list copied from the original.
List< Whatever > unmodifiableList = Collections.unmodifiableList( tempList ) ;
严格 要真正复制的行为,您需要检查原始列表是否已经不可修改。如果是,则不采取任何行动。原始列表作为方法调用的结果返回。引用Javadoc:

如果给定集合是不可修改的列表,则调用copyOf通常不会创建副本

您还应该执行一些空检查。引用Javadoc:

给定集合不能为null,并且它不能包含任何null元素


最后,我将添加一个友好的建议,您考虑升级过去的java 8。在这几年中,许多精彩的新功能被添加。目前,Java 16是最新版本,今年秋天(2021-09-14)的Java 17可能会被指定为一个版本。

如果您真正指的是方法,请阅读。如果你真的是这个意思,读一下这个答案

在调用集合之前实例化新列表。不可修改列表 返回仅是原始视图的对象是正确的。因此,如果原始列表发生更改,则不可修改列表也会发生更改

解决方案很简单:在传递到
集合之前,将列表复制到新的新列表中。不可修改的列表

List< Whatever > tempList = new ArrayList<>( myOriginalList ) ;  // Passing a collection to constructor of `ArrayList` creates an entirely new fresh list copied from the original.
List< Whatever > unmodifiableList = Collections.unmodifiableList( tempList ) ;
严格 要真正复制的行为,您需要检查原始列表是否已经不可修改。如果是,则不采取任何行动。原始列表作为方法调用的结果返回。引用Javadoc:

如果给定集合是不可修改的列表,则调用copyOf通常不会创建副本

您还应该执行一些空检查。引用Javadoc:

给定集合不能为null,并且它不能包含任何null元素



最后,我将添加一个友好的建议,您考虑升级过去的java 8。在这几年中,许多精彩的新功能被添加。目前,Java 16是最新版本,今年秋天(2021-09-14)的Java 17可能会被指定为一个版本。

使用是一个选项。使用
new ArrayList
复制然后包装到
集合中。不可修改列表()
。您还可以使用
Arrays.asList
来包装varargs。
List.of
不会创建另一个列表的不可变副本。。。它创建一个不可变的列表,其中包含您提供给它的元素。你有没有把它和List.copyOf混为一谈?老实说,没有确切的等价物
List.of
创建了一个
ImmutableCollections.ListN
,它实际上在检查和允许的方面有相当多的功能。为了提高效率,它还配备了一个阵列。最简单的替换可能是
Stream.of()。collect(toList())
使用是一个选项。使用
new ArrayList
复制然后包装到
集合中。不可修改列表()
。您还可以使用
Arrays.asList
来包装varargs。
List.of
不会创建另一个列表的不可变副本。。。它创建一个不可变的列表,其中包含您提供给它的元素。你有没有把它和List.copyOf混为一谈?老实说,没有确切的等价物
List.of
创建了一个
ImmutableCollections.ListN
,它实际上在检查和允许的方面有相当多的功能。为了提高效率,它还配备了一个阵列。最接近的简单替换可能是
Stream.of().collect(toList())
您可以使用
new ArrayList(Arrays.asList(…))进行简化
您可以使用
new ArrayList(Arrays.asList(…)进行简化
List< Whatever > unmodifiableList = Collections.unmodifiableList( new ArrayList<>( myOriginalList ) ) ;