Самый простой способ конвертировать список в набор в Java - PullRequest
576 голосов
/ 16 сентября 2009

Какой самый простой способ преобразовать List в Set в Java?

Ответы [ 15 ]

3 голосов
/ 01 марта 2018

В Java 10 теперь можно использовать Set#copyOf для простого преобразования List<E> в неизменяемое Set<E>:

Пример:

var set = Set.copyOf(list);

Имейте в виду, что это неупорядоченная операция, и null элементы не разрешены, так как это вызовет NullPointerException.

Если вы хотите, чтобы он был модифицируемым, просто передайте его в конструктор Set реализации.

3 голосов
/ 01 июля 2015

Существуют различные способы получить Set как:

    List<Integer> sourceList = new ArrayList();
    sourceList.add(1);
    sourceList.add(2);
    sourceList.add(3);
    sourceList.add(4);

    // Using Core Java
    Set<Integer> set1 = new HashSet<>(sourceList);  //needs null-check if sourceList can be null.

    // Java 8
    Set<Integer> set2 = sourceList.stream().collect(Collectors.toSet());
    Set<Integer> set3 = sourceList.stream().collect(Collectors.toCollection(HashSet::new));

    //Guava
    Set<Integer> set4 = Sets.newHashSet(sourceList);

    // Apache commons
    Set<Integer> set5 = new HashSet<>(4);
    CollectionUtils.addAll(set5, sourceList);

Когда мы используем Collectors.toSet(), он возвращает набор и согласно документу: There are no guarantees on the type, mutability, serializability, or thread-safety of the Set returned. Если мы хотим получить HashSet, тогда мы можем использовать другую альтернативу, чтобы получить набор (отметьте set3).

2 голосов
/ 18 сентября 2018

Лучший способ использовать конструктор

Set s= new HashSet(list);

В Java 8 вы также можете использовать поток API ::

Set s= list.stream().collect(Collectors.toSet());
2 голосов
/ 20 января 2018

Более устойчивое решение Java 8 с Optional.ofNullable

Set<Foo> mySet = Optional.ofNullable(myList).map(HashSet::new).orElse(null);
1 голос
/ 24 июня 2019

Если вы используете Eclipse Collections :

MutableSet<Integer> mSet = Lists.mutable.with(1, 2, 3).toSet();
MutableIntSet mIntSet = IntLists.mutable.with(1, 2, 3).toSet();

Интерфейс MutableSet расширяет java.util.Set, а интерфейс MutableIntSet - нет. Вы также можете преобразовать любой Iterable в Set, используя фабричный класс Sets.

Set<Integer> set = Sets.mutable.withAll(List.of(1, 2, 3));

Более подробное объяснение изменчивых фабрик доступно в Eclipse Collections здесь .

Если вы хотите ImmutableSet от List, вы можете использовать фабрику Sets следующим образом:

ImmutableSet<Integer> immutableSet = Sets.immutable.withAll(List.of(1, 2, 3))

Примечание: я являюсь коммиттером для Eclipse Collections

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...