Ответы:
Я согласен с sepp2k, но есть некоторые другие детали, которые могут иметь значение:
new HashSet<Foo>(myList);
даст вам несортированный набор, который не имеет дубликатов. В этом случае дублирование идентифицируется с помощью метода .equals () на ваших объектах. Это делается в сочетании с методом .hashCode (). (Подробнее о равенстве смотрите здесь )
Альтернатива, которая дает отсортированный набор:
new TreeSet<Foo>(myList);
Это работает, если Foo реализует Comparable. Если это не так, вы можете использовать компаратор:
Set<Foo> lSet = new TreeSet<Foo>(someComparator);
lSet.addAll(myList);
Это зависит либо от CompareTo () (из сопоставимого интерфейса), либо от Compare () (от компаратора) для обеспечения уникальности. Итак, если вы просто заботитесь об уникальности, используйте HashSet. Если вы после сортировки, то рассмотрите TreeSet. (Помните: оптимизируйте позже!) Если эффективность времени имеет значение, используйте HashSet, если эффективность пространства имеет значение, посмотрите на TreeSet. Обратите внимание, что более эффективные реализации Set и Map доступны через Trove (и другие места).
Если вы используете библиотеку Guava :
Set<Foo> set = Sets.newHashSet(list);
или лучше:
Set<Foo> set = ImmutableSet.copyOf(list);
ImmutableSet.of(), например, с этим. РЕДАКТИРОВАТЬ: это не может быть фактором, потому что все перегрузки не нужны.
Используя Java 8 вы можете использовать поток:
List<Integer> mylist = Arrays.asList(100, 101, 102);
Set<Integer> myset = mylist.stream().collect(Collectors.toSet()));
Set<E> alphaSet = new HashSet<E>(<your List>);
или полный пример
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class ListToSet
{
public static void main(String[] args)
{
List<String> alphaList = new ArrayList<String>();
alphaList.add("A");
alphaList.add("B");
alphaList.add("C");
alphaList.add("A");
alphaList.add("B");
System.out.println("List values .....");
for (String alpha : alphaList)
{
System.out.println(alpha);
}
Set<String> alphaSet = new HashSet<String>(alphaList);
System.out.println("\nSet values .....");
for (String alpha : alphaSet)
{
System.out.println(alpha);
}
}
}
Я бы выполнил проверку Null перед преобразованием в set.
if(myList != null){
Set<Foo> foo = new HashSet<Foo>(myList);
}
Set<Foo> foo = myList == null ? Collections.emptySet() : new HashSet<Foo>(myList);
Вы можете конвертировать List<>вSet<>
Set<T> set=new HashSet<T>();
//Added dependency -> If list is null then it will throw NullPointerExcetion.
Set<T> set;
if(list != null){
set = new HashSet<T>(list);
}
Для Java 8 это очень просто:
List < UserEntity > vList= new ArrayList<>();
vList= service(...);
Set<UserEntity> vSet= vList.stream().collect(Collectors.toSet());
new ArrayList<>();-)
Java - addAll
set.addAll(aList);
Java - новый объект
new HashSet(list)
Java-8
list.stream().collect(Collectors.toSet());
Используя Guva
Sets.newHashSet(list)
Apache Commons
CollectionUtils.addAll(targetSet, sourceList);
Java 10
var set = Set.copyOf(list);
Лучший способ использовать конструктор
Set s= new HashSet(list);
В Java 8 вы также можете использовать поток API:
Set s= list.stream().collect(Collectors.toSet());
Есть несколько способов получить 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).
С Java 10 теперь вы можете Set#copyOfлегко преобразовать его List<E>в неизменяемое Set<E>:
Пример:
var set = Set.copyOf(list);
Имейте в виду, что это неупорядоченная операция, и nullэлементы не разрешены, так какNullPointerException .
Если вы хотите, чтобы он был изменяемым, просто передайте его в конструктор Setреализации.
Более устойчивое решение Java 8 с Optional.ofNullable
Set<Foo> mySet = Optional.ofNullable(myList).map(HashSet::new).orElse(null);
Если вы используете 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 здесь .
Если вы хотите ImmutableSetот a List, вы можете использовать Setsфабрику следующим образом:
ImmutableSet<Integer> immutableSet = Sets.immutable.withAll(List.of(1, 2, 3))
Примечание: я являюсь коммиттером для коллекций Eclipse
Помните, что преобразование из List в Set удалит дубликаты из коллекции, потому что List поддерживает дубликаты, но Set не поддерживает дубликаты в Java.
Прямое преобразование: самый распространенный и простой способ преобразования списка в набор.
// Creating a list of strings
List<String> list = Arrays.asList("One", "Two", "Three", "Four");
// Converting a list to set
Set<String> set = new HashSet<>(list);
Коллекции Apache Commons: Вы также можете использовать API Коллекции Commons для преобразования Списка в Набор: -
// Creating a list of strings
List<String> list = Arrays.asList("One", "Two", "Three", "Four");
// Creating a set with the same number of members in the list
Set<String> set = new HashSet<>(4);
// Adds all of the elements in the list to the target set
CollectionUtils.addAll(set, list);
Использование потока: Другой способ - преобразовать данный список в поток, а затем установить поток: -
// Creating a list of strings
List<String> list = Arrays.asList("One", "Two", "Three", "Four");
// Converting to set using stream
Set<String> set = list.stream().collect(Collectors.toSet());
SetиMapкакой используется;HashSetкак предполагается , здесь.