Ответы:
Я согласен с 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
как предполагается , здесь.