Создание объекта с использованием потоков Java

У меня вопрос относительно потоков Java. Я построил ниже карты.

  1. Одна карта включает название страны в качестве ключа и список городов в качестве значения.
  2. Другой включает название континента в качестве ключа и список стран в качестве значения.
List<String> inCities = new ArrayList<String>(Arrays.asList("Delhi", "Mumbai", "Hyderabad", "Banglore", "Chennai"));
List<String> jpCities = new ArrayList<String>(Arrays.asList("Tokyo", "Osaka", "Kyoto"));
List<String> usCities = new ArrayList<String>(Arrays.asList("Dallas", "Chicago", "NewYork"));
List<String> ukCities = new ArrayList<String>(Arrays.asList("London", "Cardiff", "Oxford"));
List<String> frCities = new ArrayList<String>(Arrays.asList("Paris", "Marseille", "Lyon"));

Map<String, List<String>> countryWiseCities = new HashMap<String, List<String>>();
countryWiseCities.put("India", inCities);
countryWiseCities.put("Japan", jpCities);
countryWiseCities.put("USA", usCities);
countryWiseCities.put("UK", ukCities);
countryWiseCities.put("France", frCities);

List<String> asiaCountries = new ArrayList<String>(Arrays.asList("India", "Japan"));
List<String> northAmericaCountries = new ArrayList<String>(Arrays.asList("USA", "Canada"));
List<String> europeCountries = new ArrayList<String>(Arrays.asList("UK", "France"));
Map<String, List<String>> continentWiseCountries = new HashMap<String, List<String>>();
continentWiseCountries.put("Asia", asiaCountries);
continentWiseCountries.put("NorthAmerica", northAmericaCountries);
continentWiseCountries.put("Europe", europeCountries);

Существующие карты.

{"India":["Delhi", "Mumbai", "Hyderabad", "Banglore", "Chennai"], "Japan":["Tokyo", "Osaka", "Kyoto"], "USA":["Dallas", "Chicago", "NewYork"], "Canada":["Ontario", "Toronto", "vancouver"],
"UK":["London", "Cardiff", "Oxford"], "France":["Paris", "Marseille", "Lyon"]}

{"Asia":["India", "Japan"], "NorthAmerica":["USA", "Canada"], "Europe":["UK", "France"]}

Я ищу способ построить карту ниже с использованием потоков Java. Каков самый простой способ добиться вывода ниже с использованием потоков Java?

Ожидаемый результат:

{"ASIA":["Delhi", "Mumbai", "Hyderabad", "Banglore", "Chennai", "Tokyo", "Osaka", "Kyoto"],
"NorthAmerica":["Dallas", "Chicago", "NewYork", "Ontario", "Toronto", "vancouver"],
"Europe":["London", "Cardiff", "Oxford", "Paris", "Marseille", "Lyon"]
  1. Здесь ключ - название континента.
  2. Значением является список городов в странах определенного континента.

Ниже приведен код, который я пробовал.

Map<String, List<Map.Entry<String, List<String>>>> collect1 = countryWiseCities.entrySet().stream()
                .collect(Collectors.groupingBy(Map.Entry::getKey));

Пожалуйста, исправьте код тестовых данных. Вы добавляете inCities только для всех ключей страны.

ernest_k 14.12.2020 07:18

Обновлен код тестовых данных

sudhir 14.12.2020 07:22
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
77
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вот что вы можете сделать:

Map<String, List<String>> continentCities = continentWiseCountries.entrySet()
    .stream()
    .map(continent -> new AbstractMap.SimpleEntry<>(
            continent.getKey(), 
            continent.getValue()
            .stream()
            .flatMap(country -> 
                        countryWiseCities.getOrDefault(country, Collections.emptyList())
                            .stream())
            .collect(Collectors.toList())))
    .collect(Collectors.toMap(Entry::getKey, Entry::getValue));

Все, что он делает, это использует промежуточный поток для соединения континентов с городами (через страны), а затем собирает пары городов и континентов.

Обратите внимание, что getOrDefault(country, Collections.emptyList()) необходим, потому что в вашем списке континентов есть страны, которых нет в вашем сопоставлении списка стран.

Вывод приведенного выше кода выглядит примерно так:

{
  "Asia" : [ "Delhi", "Mumbai", "Hyderabad", "Banglore", "Chennai", "Tokyo", "Osaka", "Kyoto" ],
  "Europe" : [ "London", "Cardiff", "Oxford", "Paris", "Marseille", "Lyon" ],
  "NorthAmerica" : [ "Dallas", "Chicago", "NewYork" ]
}

Это сработало. Спасибо :). Я буду читать больше о flatMap.

sudhir 14.12.2020 07:37

Здесь решение без промежуточного потока, просто с использованием flatMap в функции-значении сборщика toMap:

Map<String, List<String>> continentCityMap = continentWiseCountries.entrySet().stream()
        .collect(Collectors.toMap(Entry::getKey,
                e -> e.getValue().stream().flatMap(
                        country -> countryWiseCities.getOrDefault(country, Collections.emptyList()).stream())
                        .collect(Collectors.toList())));

Другие вопросы по теме