Структурирование списка данных с использованием Java 8 и его нормализация в структуру карты - PullRequest
5 голосов
/ 20 июня 2019

Итак, я все еще новичок в Java 8 и все еще пытаюсь соотнести API потоков с традиционной итерацией и коллекциями.

Итак, у меня есть список объекта «UserData», который имеет 3 свойства, список всех денормализованных данных.

 public class UserData {

        private String primaryAccountNumber;
        private String subAccountNumber;
        private String currency;
}

Пример входных данных будет выглядеть как

PrimaryAccNumber     SubAccNumber   Currency
PA00                 US00           USD
PA01                 US01           USD
PA01                 US02           USD
PA02                 EU00           EUR
PA03                 EU01           EUR
PA04                 CA00           CAD
PA04                 CA01           CAD
null                 IN00           INR
null                 IN01           INR

Ожидаемый результат должен быть примерно таким:

USD  -> PA00 -> [US00]
        PA01 -> [US01,US02]
EUR  -> PA02 -> [EU00]
     -> PA03 -> [EU01]
CAD  -> PA04 -> [CA00,CA01]
INR  -> null (or dummykey)->[IN00,IN01]

Итак, я хочу, чтобы он был нормализован таким образом, чтобы результатом была карта с валютой, а значением должна быть другая карта с первичным счетом и значением со списком дополнительных счетов.

Map<String, Map<String,List<String>>> normalizedData = //logic

Я думал о том, чтобы сделать этот способ старой школы в основном

  1. Сортировка данных по валюте.
  2. Переберите список и поместите данные в Map (поскольку данные отсортированы и пока я не получу дубликаты ключей начнут ставить соответствующие данные (основной аккаунт на новой карте)
  3. Повторите описанный выше процесс в основном на уровне основного аккаунта и начните вводить дубликат ключа, соответствующий данные значения (субсчета в объекте списка)

Что касается моего мыслительного процесса, мне нужно создать 2 списка списка (1 сортировка в валюте для первой итерации), 2-я сортировка в основной учетной записи для вложенной карты. Это кажется немного неэффективным, тогда я посмотрел на потоки, но не мог представить, как я могу их использовать, но любые указания или мысли были бы оценены.

1 Ответ

8 голосов
/ 20 июня 2019

Это довольно просто с потоками. Вам нужна пара вложенных группировок и отображение в конце. Для краткости я предполагаю, что у вас есть статический импорт java.util.stream.Collectors.*.

Map<String, Map<String, List<String>>> normalizedData = users.stream().collect(
        groupingBy(UserData::getCurrency,
                groupingBy(UserData::getPrimaryAccountNumber,
                        mapping(UserData::getSubAccountNumber, toList()))));

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...