【问题标题】:Grouping By repeated item List按重复项列表分组
【发布时间】:2018-09-12 12:13:54
【问题描述】:

我有一个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)

  • 发票_1
  • 发票_2

Provider_A (记录 2)

  • 发票_3

预期:

提供者_A

  • 发票_1
  • 发票_2
  • 发票_3

我尝试使用Collectors.groupingBy,它可以工作,但它返回一个Map&lt;Long, List&lt;Provider&gt;&gt;,它必须是一个列表。我正在考虑使用它,然后切换到一个列表,但它看起来像是一种解决方法,也许它有更好的方式通过立即返回 List&lt;Provider&gt; 进行分组。有什么帮助吗?

【问题讨论】:

  • 等等,什么?又是什么预期结果?
  • 所以您的意思是按供应商名称尝试合并发票列表?
  • 它必须返回一个 java.util.List @Eugene;是的,@manfromnowhere 按提供商名称合并发票列表,并以 java.util.List 形式返回
  • 在这种情况下,如果我的答案是ArrayList...

标签: java-8


【解决方案1】:

如果我理解正确的话:

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

【讨论】:

  • 嘿@Eugene,在'left'和'right'变量上,不可能获取属性,它只允许获取'class'; left.getClass() 和 right.getClass()... 它是一个对象。您是如何从“提供者”获取属性的?
  • @fernandokarpinski 我刚才根据你的代码在我的IDE中创建了一些小类,对我来说效果很好,可能是IDE问题?
  • 你必须指定类型。
  • @m4gic 除非它当然是由编译器推断出来的,并且它们应该被推断出来。
  • 是的,但不幸的是,当我试图不指定它们时,我的 Eclipse 抱怨(是的,它“推断”了 Object 类型......)
【解决方案2】:

更痛苦的方式:

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

【讨论】:

  • 我也会接受你的回答,顺便说一句,它更优雅,并且使用 ctrl+空格 Eclipse IDE 自动完成,非常感谢!
  • 谢谢 :) 但是当我看到 Eugene 的帖子时,我几乎把我的版本扔掉了 :) 我发布了一个威慑例子。如果你放弃得太早,就会得到这样的结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-25
  • 2014-08-06
  • 2013-09-18
  • 1970-01-01
  • 2018-07-29
  • 2016-11-12
相关资源
最近更新 更多