В качестве примечания, Collectors.toUnmodifiableList
просто использует реализацию List::of
, которая была добавлена в java-9, финализатор для этой реализации:
list -> (List<T>)List.of(list.toArray()
, где list
это простоArrayList
;поэтому ваш вопрос сводится к тому, в чем разница между List::of
и Collections::unmodifiableList
(конечно, с оговоркой, что это не указано и происходит при текущей реализации ), и хотя я мог бы детализировать некоторые изразличия, уже есть хорошие (и многие другие, если вы будете искать).
Следует обратить внимание на то, как эти различные типы обрабатывают null
s (другой момент, когда одинна самом деле представление , уже было предоставлено в других ответах):
List<Integer> left = Stream.of(1, 2, 3)
.collect(Collectors.collectingAndThen(
Collectors.toList(),
Collections::unmodifiableList));
System.out.println(left.contains(null));
List<Integer> right = Stream.of(1, 2, 3)
.collect(Collectors.toUnmodifiableList());
System.out.println(right.contains(null));
В последней строке кода будет выдано исключение, вы можете даже не ожидать этого.