Самый краткий способ конвертировать Set <String>в List <String> - PullRequest
197 голосов
/ 23 февраля 2010

Я сейчас занимаюсь этим:

Set<String> setOfTopicAuthors = ....

List<String> list = Arrays.asList( 
    setOfTopicAuthors.toArray( new String[0] ) );

Можете ли вы победить это?

Ответы [ 6 ]

422 голосов
/ 23 февраля 2010
List<String> list = new ArrayList<String>(listOfTopicAuthors);
88 голосов
/ 23 февраля 2010
List<String> l = new ArrayList<String>(listOfTopicAuthors);
22 голосов
/ 24 августа 2015

Учитывая, что у нас есть 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 .

13 голосов
/ 22 мая 2013

Попробуйте это для Установите :

Set<String> listOfTopicAuthors = .....
List<String> setList = new ArrayList<String>(listOfTopicAuthors); 

Попробуйте это для Карта :

Map<String, String> listOfTopicAuthors = .....
// List of values:
List<String> mapValueList = new ArrayList<String>(listOfTopicAuthors.values());
// List of keys:
List<String> mapKeyList = new ArrayList<String>(listOfTopicAuthors.KeySet());
2 голосов
/ 08 февраля 2014

Если вы используете Guava, вы статически импортируете метод newArrayList из Списки класс:

List<String> l = newArrayList(setOfAuthors);
0 голосов
/ 16 июля 2015

не совсем уверен, что вы делаете именно через контекст вашего кода, но ...

зачем вообще делать переменную listOfTopicAuthors

List<String> list = Arrays.asList((....).toArray( new String[0] ) );

"...." обозначает, каким образом ваш сет вступил в игру, будь то новый или пришедший из другого места.

...