一个区别是,它提供了一个不可变的实现(无法添加到或排序的类型),类似于 由 提供的可变(可以更改和排序)的实现,并且与 提供的可变(可以更改和排序)相反。Stream.toList()
List
ImmutableCollections.ListN
List.of()
ArrayList
Stream.collect(Collectors.toList())
演示:
import java.util.stream.Stream;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<String> list = Stream.of("Hello").toList();
System.out.println(list);
list.add("Hi");
}
}
输出:
[Hello]
Exception in thread "main" java.lang.UnsupportedOperationException
at java.base/java.util.ImmutableCollections.uoe(ImmutableCollections.java:142)
at java.base/java.util.ImmutableCollections$AbstractImmutableCollection.add(ImmutableCollections.java:147)
at Main.main(Main.java:8)
请查看此文章了解更多详情。
更新:
有趣的是,成功返回包含 s 的列表。Stream.toList()
null
import java.util.stream.Stream;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<Object> list = Stream.of(null, null).toList();
System.out.println(list);
}
}
输出:
[null, null]
另一方面,投掷 .List.of(null, null)
NullPointerException
import java.util.List;
public class Main {
public static void main(String[] args) {
List<Object> list = List.of(null, null);
}
}
输出:
Exception in thread "main" java.lang.NullPointerException
at java.base/java.util.Objects.requireNonNull(Objects.java:208)
at java.base/java.util.ImmutableCollections$List12.<init>(ImmutableCollections.java:453)
at java.base/java.util.List.of(List.java:827)
at Main.main(Main.java:5)
注意:我使用 openjdk-16-ea+34_osx-x64 来编译和执行 Java SE 16 代码。
有用的资源:
- JDK 错误 #JDK-8180352
- 使用单个空参数调用 Java varargs 方法?