Автор оригинала: Ognjen Jankovic.
Вступление
Реализация Java Map представляет собой коллекцию , которая сопоставляет ключи со значениями. Каждая запись Карты содержит пары ключ/значение, и каждый ключ связан ровно с одним значением. Ключи уникальны, поэтому дубликаты невозможны.
Общей реализацией интерфейса Map
является Хэш-карта
:
Mapstudents = new HashMap<>(); students.put(132, "James"); students.put(256, "Amy"); students.put(115, "Young"); System.out.println("Print Map: " + students);
Мы создали простую карту студентов (строк) и их соответствующих идентификаторов:
Print Map: {256=Amy, 115=Young, 123=James}
Реализация Java List представляет собой коллекцию , в которой последовательно хранятся ссылки на элементы. Каждый элемент имеет индекс и однозначно идентифицируется им:
Listlist = new ArrayList<>(Arrays.asList("James", "Amy", "Young")); System.out.println(list); System.out.println(String.format("Third element: %s", list.get(2));
[James, Amy, Young] Third element: Young
Ключевое различие заключается в следующем: Карты имеют два измерения, в то время как Списки имеют одно измерение.
Однако это не мешает нам конвертировать Карты в Списки с помощью нескольких подходов. В этом уроке мы рассмотрим, как преобразовать карту Java в список Java :
- Преобразование карты в список карт.Запись
- Преобразуйте карту в список, используя два списка
- Коллекционеры.Список и поток.карта()
- Stream.filter() и Stream.sorted()
- Stream.flatMap()
Преобразование карты в список карт.Запись
Java 8 познакомила нас с потоковым API, который был задуман как шаг к интеграции Функционального программирования в Java, чтобы сделать трудоемкие, громоздкие задачи более удобочитаемыми и простыми. Потоки замечательно работают с коллекциями и могут помочь нам преобразовать карту в список.
Самый простой способ сохранить сопоставления ключ-значение
, все еще преобразуя его в//Список//, – это
stream()
записи , которые состоят из пар ключ-значение.
Метод entrySet()
возвращает Набор
элементов Map.Entry
, которые можно легко преобразовать в Список
, учитывая, что они оба реализуют Коллекцию
:
List> singleList = students.entrySet() .stream() .collect(Collectors.toList()); System.out.println("Single list: " + singleList);
Это приводит к:
Single list: [256=Amy, 115=Young, 132=James]
Поскольку потоки сами по себе не являются коллекциями – они просто передают данные из коллекции – Коллекторы
используются для сбора результата операций Потока
обратно в Коллекцию
. Один из Коллекционеров , который мы можем использовать, – это Коллекционеры.ToList()
, который собирает элементы в Список
.
Преобразуйте карту в список, используя два списка
Поскольку Карты являются двумерными коллекциями, в то время как Списки являются одномерными коллекциями-другим подходом было бы преобразование Карты
в два Списка
, один из которых будет содержать ключи Карты , в то время как другой будет содержать значения Карты .
К счастью, мы можем легко получить доступ к ключам и значениям карты с помощью методов keySet()
и values ()
.
Метод keySet()
возвращает Набор
всех ключей, что и следовало ожидать, поскольку ключи должны быть уникальными . Благодаря гибкости коллекций Java – мы можем создать Список
из Набора
, просто передав Набор
в конструктор Списка
.
Метод values()
возвращает Коллекцию
значений на карте, и, естественно , поскольку Список реализует коллекцию
, преобразование так же просто, как передача его в конструкторе List
:
ListkeyList = new ArrayList(students.keySet()); List valueList = new ArrayList(students.values()); System.out.println("Key List: " + keyList); System.out.println("Value List: " + valueList);
Это приводит к:
Key List: [256, 115, 132] Value List: [Amy, Young, James]
Преобразуйте карту в список с коллекционерами.ToList() и Stream.map()
Мы steam()
ключи и значения Карты
, а затем соберем()
их в Список
:
Git Essentials
Ознакомьтесь с этим практическим руководством по изучению Git, содержащим лучшие практики и принятые в отрасли стандарты. Прекратите гуглить команды Git и на самом деле изучите это!
ListkeyList = students.keySet().stream().collect(Collectors.toList()); System.out.println("Key list: " + keyList); List valueList = students.values().stream().collect(Collectors.toList()); System.out.println("Value list: " + valueList);
Это приводит к:
Key list: [256, 115, 132] Value list: [Amy, Young, James]
Преимущество этого подхода заключается в том, что он позволяет нам выполнять различные другие операции или преобразования с данными до их сбора. Например, зная, что мы работаем со строками, мы могли бы прикрепить анонимную функцию ( Лямбда – выражение ). Например, мы могли бы поменять местами байты каждого целого числа
(ключа) и прописные буквы каждой Строки
(значения), прежде чем собирать их в Список
:
ListkeyList = students.keySet() .stream() .map(Integer::reverseBytes) .collect(Collectors.toList()); System.out.println("Key list: " + keyList); List valueList = students.values() .stream() .map(String::toLowerCase) .collect(Collectors.toList()); System.out.println("Value list: " + valueList);
Примечание: Метод map()
возвращает новый Поток
, в котором к каждому элементу применяется предоставленное лямбда-выражение. Если вы хотите узнать больше о методе Stream.map ()
, прочитайте наш учебник Java 8 – Stream.map () .
Выполнение этого кода преобразует каждое значение в потоках, прежде чем возвращать их в виде списков:
Key list: [65536, 1929379840, -2080374784] Value list: [amy, young, james]
Мы также можем использовать метод Collectors.toCollection ()
, который позволяет нам выбрать конкретную реализацию List
:
ListkeyList = students.keySet() .stream() .collect(Collectors.toCollection(ArrayList::new)); List valueList = students.values() .stream() .collect(Collectors.toCollection(ArrayList::new)); System.out.println("Key list: " + keyList); System.out.println("Value list: " + valueList);
Это приводит к:
Key list: [256, 115, 132] Value list: [Amy, Young, James]
Преобразуйте карту в список с помощью Stream.filter() и Stream.sorted()
Мы не ограничиваемся только отображением значений в их преобразования с помощью Stream
s. Мы также можем фильтровать и сортировать коллекции, чтобы создаваемые нами списки содержали определенные выбранные элементы. Это легко достигается с помощью сортировки()
и фильтра()
:
ListsortedValueList = students.values() .stream() .sorted() .collect(Collectors.toList()); System.out.println("Sorted Values: " + sortedValueList);
После того, как мы отсортировали значения, мы получаем следующий результат:
Sorted Values: [Amy, James, Young]
Мы также можем передать пользовательский компаратор в метод sorted()
:
ListsortedValueList = students.values() .stream() .filter(value-> value.startsWith("J")) .collect(Collectors.toList()); System.out.println("Sorted Values: " + sortedValueList);
Что приводит к:
Sorted Values: [James]
Если вы хотите узнать больше о методе sorted()
и о том, как его использовать – у нас есть руководство по Как отсортировать список с помощью Stream.sorted() .
Преобразуйте карту в список с помощью Stream.flatMap()
flatMap()
является еще одним Потоковым
методом, используемым для сглаживания двумерного потока коллекции в одномерный поток коллекции. В то время как Stream.map()
предоставляет нам отображение A->B , метод Stream.flatMap()
предоставляет нам отображение A -> Stream , которое затем снова сглаживается в один поток.
Если у нас есть двумерный Поток или Поток Потока, мы можем сплющить его в единый. Концептуально это очень похоже на то, что мы пытаемся сделать – преобразовать 2D-коллекцию в 1D-коллекцию. Давайте немного все перепутаем,создав Карту V> , где ключи имеют тип Целое число
, а значения имеют тип Список<Строка>
: V>
Map> newMap = new HashMap<>(); List firstName = new ArrayList(); firstName.add(0, "Jon"); firstName.add(1, "Johnson"); List secondName = new ArrayList(); secondName.add(0, "Peter"); secondName.add(1, "Malone"); // Insert elements into the Map newMap.put(1, firstName); newMap.put(2, secondName); List valueList = newMap.values() .stream() // Aforementioned A -> Stream mapping .flatMap(e -> e.stream()) .collect(Collectors.toList()); System.out.println(valueList);
Это приводит к:
[Jon, Johnson, Peter, Malone]
Вывод
В этом уроке мы рассмотрели, как преобразовать карту в список на Java несколькими способами с использованием или без использования Java 8 stream API.