Учитывая, что у нас есть Set<String> stringSet
, мы можем использовать следующее:
Java 10 (неизменяемый список)
List<String> strList = stringSet.stream().collect(Collectors.toUnmodifiableList());
Java 8 (изменяемые списки)
import static java.util.stream.Collectors.*;
List<String> stringList1 = stringSet.stream().collect(toList());
Согласно Документ для метода toList()
Нет никаких гарантий относительно типа, изменчивости, сериализуемости или
потокобезопасность возвращенного списка; если больше контроля над возвращенным
Список обязателен, используйте toCollection (Поставщик).
Так что, если нам нужна конкретная реализация, например ArrayList
мы можем получить это так:
List<String> stringList2 = stringSet.stream().
collect(toCollection(ArrayList::new));
Java 8 (неизменяемые списки)
Мы можем использовать метод Collections::unmodifiableList
и перенести список, возвращенный в предыдущих примерах. Мы также можем написать наш собственный метод как:
class ImmutableCollector {
public static <T> Collector<T, List<T>, List<T>> toImmutableList(Supplier<List<T>> supplier) {
return Collector.of( supplier, List::add, (left, right) -> {
left.addAll(right);
return left;
}, Collections::unmodifiableList);
}
}
А затем используйте его как:
List<String> stringList3 = stringSet.stream()
.collect(ImmutableCollector.toImmutableList(ArrayList::new));
Другая возможность заключается в использовании метода collectingAndThen
, который позволяет выполнить некоторое окончательное преобразование перед возвратом результата:
List<String> stringList4 = stringSet.stream().collect(collectingAndThen(
toCollection(ArrayList::new),Collections::unmodifiableList));
Один примечание заключается в том, что метод Collections::unmodifiableList
возвращает неизменяемое представление указанного списка согласно doc . Неизменяемая коллекция представлений - это коллекция, которая не может быть изменена, а также является представлением резервной коллекции. Обратите внимание, что изменения в резервной коллекции все еще возможны, и если они происходят, они видны через неизменяемое представление. Но метод коллектора Collectors.unmodifiableList
возвращает действительно неизменный список в Java 10 .