Автор оригинала: Pankaj Kumar.
Списки в Java представляют собой упорядоченный набор данных, где активы представляют собой неупорядоченный набор данных. В списке могут быть повторяющиеся записи, в наборе-нет. Обе структуры данных полезны в разных сценариях.
Полезно знать, как преобразовать набор в список. Он может преобразовывать неупорядоченные данные в упорядоченные данные.
Инициализация набора
Давайте инициализируем набор и добавим в него некоторые элементы.
import java.util.*; public class Main { public static void main(String[] args) { Seta = 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) { Seta = 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) { Seta = 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) { Seta = 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) { Seta = 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) { Seta = 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) { Seta = 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) { Seta = 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) { Seta = 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() ничего не гарантирует. Конструктор и добавить все() являются наиболее надежными среди пакетов.