Автор оригинала: Pankaj Kumar.
Списки в Java представляют собой упорядоченный набор данных, где активы представляют собой неупорядоченный набор данных. В списке могут быть повторяющиеся записи, в наборе-нет. Обе структуры данных полезны в разных сценариях.
Полезно знать, как преобразовать набор в список. Он может преобразовывать неупорядоченные данные в упорядоченные данные.
Инициализация набора
Давайте инициализируем набор и добавим в него некоторые элементы.
import java.util.*;
public class Main {
public static void main(String[] args)
{
Set a = new HashSet<>();
a.add(1);
a.add(2);
a.add(3);
a.add(1);
System.out.println(a);
}
}
Метод add() HashSet добавляет элементы в набор. Обратите внимание, что элементы различны. Невозможно получить элементы в соответствии с порядком их вставки, так как наборы неупорядочены.
Преобразование набора в список на Java
Давайте преобразуем набор в список. Для этого существует несколько способов. Каждый способ отличается от другого, и эти различия неуловимы.
1. Конструктор списка с установленным аргументом
Самый простой способ преобразовать набор в список – передать набор в качестве аргумента при создании списка. Это вызывает конструктор , и с этого момента конструктор позаботится обо всем остальном.
import java.util.*;
public class Main {
public static void main(String[] args)
{
Set a = new HashSet<>();
a.add(1);
a.add(2);
a.add(3);
a.add(1);
List arr = new ArrayList<>(a);
System.out.println(arr);
System.out.println(arr.get(1));
}
}
Поскольку набор был преобразован в список, элементы теперь упорядочены. Это означает, что мы можем использовать метод get() для доступа к элементам по индексу.
2. Использование обычной петли для
Мы можем использовать старый добрый цикл for для явного копирования элементов из набора в список.
import java.util.*;
public class Main {
public static void main(String[] args)
{
Set a = new HashSet<>();
a.add(1);
a.add(2);
a.add(3);
a.add(1);
List arr = new ArrayList<>(a);
for (int i : a)
arr.add(i);
System.out.println(arr);
System.out.println(arr.get(1));
}
}
Цикл For проходит по заданному элементу за элементом и добавляет элементы в список.
3. Метод добавления списка()
В списках есть метод add All (), который добавляет в список сразу несколько значений. Возможно, вы помните эту операцию по ее использованию при объединении двух списков. addAll() также работает для добавления элементов набора в список.
import java.util.*;
public class Main {
public static void main(String[] args)
{
Set a = new HashSet<>();
a.add(1);
a.add(2);
a.add(3);
a.add(1);
List arr = new ArrayList<>();
arr.addAll(a);
System.out.println(arr);
System.out.println(arr.get(1));
}
}
4. Метод сбора API потока()
Stream.collect() доступен с Java 8 и далее. ToList коллектор собирает все элементы потока в экземпляр списка.
import java.util.*;
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args)
{
Set a = new HashSet<>();
a.add(1);
a.add(2);
a.add(3);
a.add(1);
List arr;
arr = a.stream().collect(Collectors.toList());
System.out.println(arr);
System.out.println(arr.get(1));
}
}
В документации для stream.collect() упоминается, что нет никакой гарантии в отношении типа, изменчивости, сериализуемости или потокобезопасности возвращаемого списка. Если требуется больший контроль над возвращаемым списком, используйте toCollection(Поставщик).
Чтобы указать тип списка, используйте toCollection(ArrayList::новый)
import java.util.*;
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args)
{
Set a = new HashSet<>();
a.add(1);
a.add(2);
a.add(3);
a.add(1);
List arr;
arr = a.stream().collect(Collectors.toCollection(ArrayList::new));
System.out.println(arr);
System.out.println(arr.get(1));
}
}
Рекомендуемое чтение : Потоки на Java
5. Метод List.copyOf()
В списке Java 10 далее есть метод copyOf () . Метод возвращает неизменяемый список , содержащий элементы данной коллекции, в порядке итерации. Список не может содержать никаких нулевых элементов. В случае, если набор содержит “null”, метод возвращает исключение нулевого указателя.
import java.util.*;
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args)
{
Set a = new HashSet<>();
a.add(1);
a.add(2);
a.add(3);
a.add(1);
List arr;
arr = List.copyOf(a);
System.out.println(arr);
System.out.println(arr.get(1));
}
}
Добавление нуля в набор и попытка преобразования в список:
import java.util.*;
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args)
{
Set a = new HashSet<>();
a.add(1);
a.add(2);
a.add(3);
a.add(1);
a.add(null);
List arr;
arr = List.copyOf(a);
System.out.println(arr);
System.out.println(arr.get(1));
}
}
Если вы попытаетесь добавить элемент в неизменяемый список, вы получите сообщение об ошибке, которое выглядит следующим образом.
Использование метода addAll() для преобразования набора с нулевым элементом в список:
import java.util.*;
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args)
{
Set a = new HashSet<>();
a.add(1);
a.add(2);
a.add(3);
a.add(1);
a.add(null);
List arr = new ArrayList<>();
arr.addAll(a);
// arr = List.copyOf(a);
System.out.println(arr);
System.out.println(arr.get(1));
}
}
Обратите внимание, что значение null отображается в начале списка.
Вывод
Мы видели несколько действительно интересных методов преобразования набора в список. Важно обратить внимание на тип списка, который создается из каждого метода. Например, метод copyOf() создает неизменяемый список и не может обрабатывать нулевые элементы. В то время как stream.collect() ничего не гарантирует. Конструктор и добавить все() являются наиболее надежными среди пакетов.