Самый краткий способ конвертировать Set & lt; String & gt; в список & lt; String & gt;

В настоящее время я делаю это:

Set setOfTopicAuthors = ....

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

Вы можете победить это?

вопрос задан 23.02.2010
Jacques René Mesrine
17149 репутация

6 ответов


  • 419 рейтинг
    List list = new ArrayList(listOfTopicAuthors);
    
    ответ дан Schildmeijer, с репутацией 17009, 23.02.2010
  • 88 рейтинг
    List l = new ArrayList(listOfTopicAuthors);
    
    ответ дан Adamski, с репутацией 44652, 23.02.2010
  • 22 рейтинг

    Учитывая, что у нас есть Set stringSet, мы можем использовать следующее:

    Java 10 (неизменяемый список)

    List strList = stringSet.stream().collect(Collectors.toUnmodifiableList());
    

    Java 8 (изменяемые списки)

    import static java.util.stream.Collectors.*;
    List stringList1 = stringSet.stream().collect(toList());
    

    Согласно документу doc для метода toList()

    Нет никаких гарантий относительно типа, изменчивости, сериализуемости или потокобезопасность возвращенного списка; если больше контроля над возвращенным Список обязателен, используйте toCollection (Поставщик).

    Итак, если нам нужна конкретная реализация e. г. ArrayList мы можем получить это так:

    List stringList2 = stringSet.stream().
                                  collect(toCollection(ArrayList::new));
    

    Java 8 (не изменяемые списки)

    Мы можем использовать метод Collections::unmodifiableList и обернуть список, возвращенный в предыдущих примерах. Мы также можем написать наш собственный метод как:

    class ImmutableCollector {
        public static  Collector, List> toImmutableList(Supplier> supplier) {
                return Collector.of( supplier, List::add, (left, right) -> {
                            left.addAll(right);
                            return left;
                        }, Collections::unmodifiableList);
            }
    }
    

    А затем использовать его как:

    List stringList3 = stringSet.stream()
                 .collect(ImmutableCollector.toImmutableList(ArrayList::new)); 
    

    Другая возможность заключается в использовании метода collectingAndThen, который позволяет выполнить некоторое окончательное преобразование перед возвратом результата:

        List stringList4 = stringSet.stream().collect(collectingAndThen(
          toCollection(ArrayList::new),Collections::unmodifiableList));
    
    ответ дан i_am_zero, с репутацией 10225, 24.08.2015
  • 13 рейтинг

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

    Set listOfTopicAuthors = .....
    List setList = new ArrayList(listOfTopicAuthors); 
    

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

    Map listOfTopicAuthors = .....
    // List of values:
    List mapValueList = new ArrayList(listOfTopicAuthors.values());
    // List of keys:
    List mapKeyList = new ArrayList(listOfTopicAuthors.KeySet());
    
    ответ дан Prabhakar Manthena, с репутацией 1078, 22.05.2013
  • 2 рейтинг

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

    List l = newArrayList(setOfAuthors);
    
    ответ дан Andrejs, с репутацией 17916, 7.02.2014
  • 0 рейтинг

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

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

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

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

    ответ дан jp093121, с репутацией 1342, 16.07.2015