按重复项列表分组

时间:2018-09-12 12:13:54

标签: java-8

我有一个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留在一个单独的列表中,所有其他{{1}一起做;像这样:

Provider_A (记录1)

  • 发票_1
  • 发票_2

提供商_A (记录2)

  • Invoice_3

预期:

Provider_A

  • 发票_1
  • 发票_2
  • Invoice_3

我尝试使用Invoice,它可以工作,但是它返回一个Collectors.groupingBy,它必须是一个列表。我当时在考虑使用此方法,然后再切换到列表,但这似乎是一种解决方法,也许通过直接返回Map<Long, List<Provider>>进行分组是一种更好的方法。有帮助吗?

2 个答案:

答案 0 :(得分:4)

如果我对您的理解正确:

yourListOfProviders
   .stream()
   .collect(Collectors.toMap(
             Provider::getIdProvider,
             Function.identity(),
             (left, right) -> {
                 left.getInvoiceList().addAll(right.getInvoiceList());
                 return left;
             }))
   .values();

答案 1 :(得分:1)

更痛苦的方式:

        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());