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