Каков самый простой способ преобразования List
в Set
в Java?
Самый простой способ преобразования списка в набор в Java
Ответ 1
Set<Foo> foo = new HashSet<Foo>(myList);
Ответ 2
Я согласен с sepp2k, но есть некоторые другие детали, которые могут иметь значение:
new HashSet<Foo>(myList);
предоставит вам несортированный набор, который не имеет дубликатов. В этом случае дублирование идентифицируется с использованием метода .equals() для ваших объектов. Это выполняется в сочетании с методом .hashCode(). (Подробнее о равенстве смотрите здесь)
Альтернативой, которая дает отсортированный набор, является:
new TreeSet<Foo>(myList);
Это работает, если Foo реализует Comparable. Если это не так, вы можете использовать компаратор:
Set<Foo> lSet = new TreeSet<Foo>(someComparator);
lSet.addAll(myList);
Это зависит либо от compareTo() (от сопоставимого интерфейса), либо от сравнения() (от компаратора), чтобы обеспечить уникальность. Итак, если вы просто заботитесь о уникальности, используйте HashSet. Если вы после сортировки, рассмотрите TreeSet. (Помните: оптимизируйте позже!) Если эффективность времени имеет значение HashSet, если проблема с пространством важна, посмотрите на TreeSet. Обратите внимание, что более эффективные реализации Set и Map доступны через Trove (и другие местоположения).
Ответ 3
Если вы используете библиотеку Guava:
Set<Foo> set = Sets.newHashSet(list);
или, лучше:
Set<Foo> set = ImmutableSet.copyOf(list);
Ответ 4
Используя java 8, вы можете использовать поток:
List<Integer> mylist = Arrays.asList(100, 101, 102);
Set<Integer> myset = mylist.stream().collect(Collectors.toSet()));
Ответ 5
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);
}
}
}
Ответ 6
Я должен выполнить проверку Null перед преобразованием в set.
if(myList != null){
Set<Foo> foo = new HashSet<Foo>(myList);
}
Ответ 7
Вы можете преобразовать 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);
}
Ответ 8
Для Java 8 это очень просто:
List < UserEntity > vList= new ArrayList<>();
vList= service(...);
Set<UserEntity> vSet= vList.stream().collect(Collectors.toSet());
Ответ 9
Давайте не будем забывать нашего относительно нового друга, java-8 stream API. Если вам нужно перепрограммировать список перед преобразованием его в набор, лучше иметь что-то вроде:
list.stream().<here goes some preprocessing>.collect(Collectors.toSet());
Ответ 10
Существуют различные способы получить 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
).
Ответ 11
В Java 10 теперь вы можете использовать Set#copyOf
для простого преобразования List<E>
в неизменяемый Set<E>
:
Пример:
var set = Set.copyOf(list);
Имейте в виду, что это неупорядоченный операция, и null
элементы не допускаются, так как он будет бросать NullPointerException
.
Если вы хотите, чтобы он был модифицируемым, просто передайте его в конструктор реализации Set
.
Ответ 12
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);
Ответ 13
Более устойчивое решение Java 8 с Optional.ofNullable
Set<Foo> mySet = Optional.ofNullable(myList).map(HashSet::new).orElse(null);
Ответ 14
Лучший способ использовать конструктор
Set s= new HashSet(list);
В Java 8 вы также можете использовать поток API:
Set s= list.stream().collect(Collectors.toSet());
Ответ 15
Если вы используете Eclipse Collections:
MutableSet<Integer> mSet = Lists.mutable.with(1, 2, 3).toSet();
MutableIntSet mIntSet = IntLists.mutable.with(1, 2, 3).toSet();
Вы также можете преобразовать любой Iterable
в Set
используя фабричный класс Sets
.
Set<Integer> set = Sets.mutable.withAll(List.of(1, 2, 3));
Более подробное объяснение изменчивых фабрик доступно в коллекциях Eclipse здесь.
Примечание: я являюсь коммиттером для коллекций Eclipse