Группировка по повторяющемуся пункту Список - PullRequest
0 голосов
/ 12 сентября 2018

У меня List<Provider> с List<Invoice> внутри; Я хотел бы изменить его порядок следующим образом:

public class Provider {
    Long idProvider;
    String name;
    List<Invoice> invoiceList;
    ...
}

public class Invoice {
    Long idInvoice;
    Integer order;
    BigDecimal value;
    LocalDate dueDate;
    ...
}

Однако каждый Provider заполнен более одного раза в списке, и мне нужно изменить его порядок так, чтобы повторяющиеся Providers оставались в одном, а все остальные Invoice составляли его вместе; Вот так:

Provider_A (запись 1)

  • Invoice_1
  • Invoice_2

Provider_A (запись 2)

  • Invoice_3

Ожидаемая:

Provider_A

  • Invoice_1
  • Invoice_2
  • Invoice_3

Я пытался использовать Collectors.groupingBy, и он работает, но он возвращает Map<Long, List<Provider>>, и это должен быть список. Я думал об использовании этого, а затем переключился на список, но это выглядит как обходной путь, возможно, у него есть лучший способ группировки, сразу возвращая List<Provider>. Любая помощь?

Ответы [ 2 ]

0 голосов
/ 12 сентября 2018

Более болезненный способ:

        Collection<Optional<Provider>> ovalues =   
                 yourListOfProviders.stream().collect(
                     Collectors.groupingBy(
                         Provider::getIdProvider, 
                         Collectors.reducing((Provider left, Provider right) -> {
                             left.getInvoiceList().addAll(right.getInvoiceList());
                             return left;
                         })
                     )
                 ).values();
        List<Provider> values = ovalues.stream().map(Optional::get).collect(Collectors.toList());
0 голосов
/ 12 сентября 2018

Если я вас правильно понял:

yourListOfProviders
   .stream()
   .collect(Collectors.toMap(
             Provider::getIdProvider,
             Function.identity(),
             (left, right) -> {
                 left.getInvoiceList().addAll(right.getInvoiceList());
                 return left;
             }))
   .values();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...