Что это самый простой способ , чтобы преобразовать List
к Set
в Java?
java
collections
OHHAI
источник
источник
Set
иMap
какой используется;HashSet
как предполагается , здесь.Я согласен с sepp2k, но есть некоторые другие детали, которые могут иметь значение:
даст вам несортированный набор, который не имеет дубликатов. В этом случае дублирование идентифицируется с помощью метода .equals () на ваших объектах. Это делается в сочетании с методом .hashCode (). (Подробнее о равенстве смотрите здесь )
Альтернатива, которая дает отсортированный набор:
Это работает, если Foo реализует Comparable. Если это не так, вы можете использовать компаратор:
Это зависит либо от CompareTo () (из сопоставимого интерфейса), либо от Compare () (от компаратора) для обеспечения уникальности. Итак, если вы просто заботитесь об уникальности, используйте HashSet. Если вы после сортировки, то рассмотрите TreeSet. (Помните: оптимизируйте позже!) Если эффективность времени имеет значение, используйте HashSet, если эффективность пространства имеет значение, посмотрите на TreeSet. Обратите внимание, что более эффективные реализации Set и Map доступны через Trove (и другие места).
источник
Если вы используете библиотеку Guava :
или лучше:
источник
ImmutableSet.of()
, например, с этим. РЕДАКТИРОВАТЬ: это не может быть фактором, потому что все перегрузки не нужны.Используя Java 8 вы можете использовать поток:
источник
или полный пример
источник
Я бы выполнил проверку Null перед преобразованием в set.
источник
Set<Foo> foo = myList == null ? Collections.emptySet() : new HashSet<Foo>(myList);
Вы можете конвертировать
List<>
вSet<>
источник
Для Java 8 это очень просто:
источник
new ArrayList<>()
;-)Java - addAll
Java - новый объект
Java-8
Используя Guva
Apache Commons
Java 10
источник
Давайте не будем забывать нашего относительно нового друга, Java-8потоковое API. Если вам нужно предварительно обработать список перед преобразованием его в набор, лучше иметь что-то вроде:
источник
Лучший способ использовать конструктор
В Java 8 вы также можете использовать поток API:
источник
Есть несколько способов получить
Set
как:Когда мы используем
Collectors.toSet()
это возвращает набор и в соответствии с доком:There are no guarantees on the type, mutability, serializability, or thread-safety of the Set returned
. Если мы хотим получить,HashSet
тогда мы можем использовать другую альтернативу, чтобы получить набор (чекset3
).источник
С Java 10 теперь вы можете
Set#copyOf
легко преобразовать егоList<E>
в неизменяемоеSet<E>
:Пример:
Имейте в виду, что это неупорядоченная операция, и
null
элементы не разрешены, так какNullPointerException
.Если вы хотите, чтобы он был изменяемым, просто передайте его в конструктор
Set
реализации.источник
Более устойчивое решение Java 8 с
Optional.ofNullable
источник
Если вы используете Eclipse Collections :
MutableSet
Интерфейс расширяет вjava.util.Set
то время какMutableIntSet
интерфейс не делает. Вы также можете преобразовать любогоIterable
кSet
используяSets
класс фабрики.Более подробное объяснение изменчивых фабрик доступно в коллекциях Eclipse здесь .
Если вы хотите
ImmutableSet
от aList
, вы можете использоватьSets
фабрику следующим образом:Примечание: я являюсь коммиттером для коллекций Eclipse
источник
Помните, что преобразование из List в Set удалит дубликаты из коллекции, потому что List поддерживает дубликаты, но Set не поддерживает дубликаты в Java.
Прямое преобразование: самый распространенный и простой способ преобразования списка в набор.
Коллекции Apache Commons: Вы также можете использовать API Коллекции Commons для преобразования Списка в Набор: -
Использование потока: Другой способ - преобразовать данный список в поток, а затем установить поток: -
источник