Одно из отличий состоит в том, что 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)
Пожалуйста, проверьте эту статью для более подробной информации.
Обновлять:
Интересно, что Stream.toList()
успешно возвращает список, содержащий null
s.
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
- Вызов метода varargs Java с одним нулевым аргументом?
person
Arvind Kumar Avinash
schedule
30.01.2021