Перейти к основному содержимому

Преобразование между списком и набором в Java

· 3 мин. чтения

1. Обзор

В этом кратком руководстве мы рассмотрим преобразование между списком и набором, начиная с Plain Java, используя Guava и библиотеку Apache Commons Collections и, наконец, с Java 10.

Эта статья является частью серии «Java — Back to Basic» здесь, на ForEach.

2. Преобразовать список в набор

2.1. С простой Java

Начнем с преобразования списка в набор с помощью Java :

public void givenUsingCoreJava_whenListConvertedToSet_thenCorrect() {
List<Integer> sourceList = Arrays.asList(0, 1, 2, 3, 4, 5);
Set<Integer> targetSet = new HashSet<>(sourceList);
}

Как мы видим, процесс преобразования является типобезопасным и простым, поскольку конструкторы каждой коллекции принимают другую коллекцию в качестве источника.

2.2. С гуавой

Давайте сделаем то же преобразование, используя Guava:

public void givenUsingGuava_whenListConvertedToSet_thenCorrect() {
List<Integer> sourceList = Lists.newArrayList(0, 1, 2, 3, 4, 5);
Set<Integer> targetSet = Sets.newHashSet(sourceList);
}

2.3. С коллекциями Apache Commons

Далее давайте воспользуемся API коллекций Commons для преобразования между List и Set :

public void givenUsingCommonsCollections_whenListConvertedToSet_thenCorrect() {
List<Integer> sourceList = Lists.newArrayList(0, 1, 2, 3, 4, 5);
Set<Integer> targetSet = new HashSet<>(6);
CollectionUtils.addAll(targetSet, sourceList);
}

2.4. С Явой 10

Еще один вариант — использовать статический фабричный метод Set.copyOf , представленный в Java 10:

public void givenUsingJava10_whenListConvertedToSet_thenCorrect() {
List sourceList = Lists.newArrayList(0, 1, 2, 3, 4, 5);
Set targetSet = Set.copyOf(sourceList);
}

Обратите внимание, что Set , созданный таким образом, не поддается изменению .

3. Преобразование набора в список

3.1. С простой Java

Теперь давайте сделаем обратное преобразование из набора в список, используя Java :

public void givenUsingCoreJava_whenSetConvertedToList_thenCorrect() {
Set<Integer> sourceSet = Sets.newHashSet(0, 1, 2, 3, 4, 5);
List<Integer> targetList = new ArrayList<>(sourceSet);
}

3.2. С гуавой

Мы можем сделать то же самое, используя решение Guava:

public void givenUsingGuava_whenSetConvertedToList_thenCorrect() {
Set<Integer> sourceSet = Sets.newHashSet(0, 1, 2, 3, 4, 5);
List<Integer> targetList = Lists.newArrayList(sourceSet);
}

Это очень похоже на подход Java, только с немного меньшим дублированием кода.

3.3. С коллекциями Apache Commons

Теперь давайте посмотрим на решение Commons Collections для преобразования между Set и List :

public void givenUsingCommonsCollections_whenSetConvertedToList_thenCorrect() {
Set<Integer> sourceSet = Sets.newHashSet(0, 1, 2, 3, 4, 5);
List<Integer> targetList = new ArrayList<>(6);
CollectionUtils.addAll(targetList, sourceSet);
}

3.4. С Явой 10

Наконец, мы можем использовать List.copyOf , представленный в Java 10:

public void givenUsingJava10_whenSetConvertedToList_thenCorrect() {
Set<Integer> sourceSet = Sets.newHashSet(0, 1, 2, 3, 4, 5);
List<Integer> targetList = List.copyOf(sourceSet);
}

Мы должны иметь в виду, что результирующий список не поддается изменению .

4. Вывод

Реализацию всех этих примеров и фрагментов кода можно найти на GitHub. Это проект на основе Maven, поэтому его легко импортировать и запускать как есть.