Самый простой способ преобразования списка в набор в Java

Каков самый простой способ преобразования List в Set в 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

Давайте не будем забывать нашего относительно нового друга, 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