Java 8 按重复项列表分组

Java 8 按重复项列表分组,java-8,Java 8,我有一个列表,里面有一个列表;我想按如下方式重新订购: public class Provider { Long idProvider; String name; List<Invoice> invoiceList; ... } public class Invoice { Long idInvoice; Integer order; BigDecimal value; LocalDate dueDate; .

我有一个
列表
,里面有一个
列表
;我想按如下方式重新订购:

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

public class Invoice {
    Long idInvoice;
    Integer order;
    BigDecimal value;
    LocalDate dueDate;
    ...
}
公共类提供程序{
长时间供应器;
字符串名;
清单发票清单;
...
}
公共类发票{
长长的声音;
整数阶;
大十进制值;
LocalDate-dueDate;
...
}
但是,每个
提供商
在一个列表中填写了不止一次,我需要重新排序,以便重复的
提供商
保留在一个列表中,而所有其他
发票
一起填写;就像这样:

提供商A(记录1)

  • 发票1
  • 发票2
提供商_A(记录2)

  • 发票3
期望值:

供应商

  • 发票1
  • 发票2
  • 发票3

我尝试使用
收集器。groupingBy
可以工作,但它返回一个
映射,并且必须是一个列表。我想用这个,然后切换到一个列表,但它看起来像是一个解决办法,也许它有一个更好的分组方式,直接返回一个
列表。有什么帮助吗?

如果我理解正确:

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

如果我理解正确:

yourListOfProviders
   .stream()
   .collect(Collectors.toMap(
             Provider::getIdProvider,
             Function.identity(),
             (left, right) -> {
                 left.getInvoiceList().addAll(right.getInvoiceList());
                 return left;
             }))
   .values();
更痛苦的方式是:

        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());
集合椭圆值=
yourListOfProviders.stream().collect(
收集者分组(
提供者::getIdProvider,
收集器。减少((提供程序左,提供程序右)->{
left.getInvoiceList().addAll(right.getInvoiceList());
左转;
})
)
).values();
List values=ovalues.stream().map(可选::get.collect(Collectors.toList());
更痛苦的方式:

        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());
集合椭圆值=
yourListOfProviders.stream().collect(
收集者分组(
提供者::getIdProvider,
收集器。减少((提供程序左,提供程序右)->{
left.getInvoiceList().addAll(right.getInvoiceList());
左转;
})
)
).values();
List values=ovalues.stream().map(可选::get.collect(Collectors.toList());


等等,什么?再次说明预期的结果是什么?您的意思是说,通过提供者名称尝试合并发票列表?它必须返回java.util.list@Eugene;是@manfromnowere by provider name,要合并发票列表,并作为java.util.list返回在这种情况下,如果我的答案是
ArrayList
,请将结果包装起来……等等,什么?再次说明预期的结果是什么?您的意思是说,通过提供者名称尝试合并发票列表?它必须返回java.util.list@Eugene;是的@manfromnowere by provider name,要合并发票列表,并以java.util.list的形式返回在这种情况下,如果我的答案是
ArrayList
…嘿@Eugene,在'left'和'right'变量上,不可能获取属性,它只允许获取'class';left.getClass()和right.getClass()。。。它是一个物体。您是如何从“Provider”中获取属性的?@fernandokarpinski我刚才根据您的代码在IDE中创建了一些小类,对我来说效果很好,可能是IDE的问题?您必须指定类型。@m4gic,当然,除非它是由编译器推断出来的,而且应该是推断出来的。是的,但不幸的是,当我试图不指定它们时,我的Eclipse抱怨(是的,它“推断”了对象类型…)嘿@Eugene,在'left'和'right'变量上,不可能获取属性,它只允许获取'class';left.getClass()和right.getClass()。。。它是一个物体。您是如何从“Provider”中获取属性的?@fernandokarpinski我刚才根据您的代码在IDE中创建了一些小类,对我来说效果很好,可能是IDE的问题?您必须指定类型。@m4gic,当然,除非它是由编译器推断出来的,而且应该是推断出来的。是的,但不幸的是,当我试图不指定它们时,我的Eclipse抱怨(是的,它“推断”了对象类型…),我也会接受你的答案,顺便说一句,它更优雅,Eclipse IDE使用ctrl+space自动完成,非常感谢!谢谢:)然而,当我看到尤金的帖子时,我几乎把我的版本扔掉了:)我把帖子作为一个威慑的例子。如果你太快放弃,你会得到这样的结果。我也会接受你的答案,顺便说一句,它更优雅,eclipse IDE使用ctrl+space自动完成,非常感谢!谢谢:)然而,当我看到尤金的帖子时,我几乎把我的版本扔掉了:)我把帖子作为一个威慑的例子。如果你过早放弃,你会得到这样的结果。