Объединение двух списков объектов, но удаление дубликатов на основе поля id - PullRequest
0 голосов
/ 23 апреля 2020

У меня есть два списка объекта заказчика. Один список представляет клиента с подпиской на XYZ, а другой - на пакет AB C. Я хочу объединить оба списка, но если в обоих списках есть какой-либо клиент с одинаковым идентификатором, я хочу обновить флаг, что он подписывается на оба пакета. Например, флаг равен 1, если пакет XYZ, 2, если AB C, и 3, если оба. Как я могу сделать это, используя java потоки? Я попытался использовать ниже, но это просто дать мне список одного общего.

List<FindCustomer> filteredList = xyzPackage.stream()
          .filter(sh -> abcPackage.stream()
            .anyMatch(sp -> 
              sh.getId().equals(sp.getId())))
            .collect(Collectors.toList()); 

1 Ответ

0 голосов
/ 23 апреля 2020

Идея состоит в том, чтобы сгруппировать подписки по идентификатору. При обнаружении дублирования «объединить» результат путем обновления флага подписки. Последний шаг - вернуть Map#values() в виде списка:

List<FindCustomer> concatenatedSubscriptions = Stream.concat(subscriptionABC.stream(), subscriptionXYZ.stream())
    .collect(Collectors.collectingAndThen(Collectors.toMap(FindCustomer::getId, Function.identity(), (c1, c2) -> {
      if (c1.getFlag() != c2.getFlag) {
        c1.setFlag(3);
      }
      return c1;
    }), map ->  new ArrayList<>(map.values())));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...