Рубрики
Без рубрики

Java 8: Как преобразовать карту в список

В этом уроке мы рассмотрим, как преобразовать карту Java в список Java с потоками, Stream.map(), Stream.filter(), Stream.sorted() и Stream.flatMap(), с примерами.

Автор оригинала: Ognjen Jankovic.

Вступление

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

Общей реализацией интерфейса Map является Хэш-карта :

Map students = 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 представляет собой коллекцию , в которой последовательно хранятся ссылки на элементы. Каждый элемент имеет индекс и однозначно идентифицируется им:

List list = 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 :

List keyList = 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 и на самом деле изучите это!

List keyList = 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]

Преимущество этого подхода заключается в том, что он позволяет нам выполнять различные другие операции или преобразования с данными до их сбора. Например, зная, что мы работаем со строками, мы могли бы прикрепить анонимную функцию ( Лямбда – выражение ). Например, мы могли бы поменять местами байты каждого целого числа (ключа) и прописные буквы каждой Строки (значения), прежде чем собирать их в Список :

List keyList = 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 :

List keyList = 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. Мы также можем фильтровать и сортировать коллекции, чтобы создаваемые нами списки содержали определенные выбранные элементы. Это легко достигается с помощью сортировки() и фильтра() :

List sortedValueList = students.values()
        .stream()
        .sorted()
        .collect(Collectors.toList());
        
System.out.println("Sorted Values: " + sortedValueList);

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

Sorted Values: [Amy, James, Young]

Мы также можем передать пользовательский компаратор в метод sorted() :

List sortedValueList = 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.