groupingBy不带ClassName :: MethodType

时间:2019-05-27 17:56:55

标签: java java-stream

我是Java新手,考虑使用Stream APi中的groupingBy,对我来说,这太复杂了:

static <T,K,A,D> Collector<T,?,Map<K,D>>
  groupingBy(Function<? super T,? extends K> classifier, 
    Collector<? super T,A,D> downstream)

如何在不指定“ Classname :: methodName”之类的快速语法的情况下对列表进行分组

在google / stackoverflow上,我们总是会找到像这样的快速语法:

.collect(Collectors.groupingBy(A::getId,              
                               Collectors.reducing(BigDecimal.ZERO, 
                                                   A::getAmount, 
                                                   BigDecimal::add)))

但是有时候我们会有一个DTO对象的列表,其中包含其他DTO对象,例如:

class bDTO{

  public cDTO cdto;
  public BigDecimal total;

}

class aDTO {
  public bDTO bdto;
}

我想按adto.bdto.cdto.id而不是aDTO::someInexistantMethod??分组

因为我所有DTO的属性都是公开的,所以我没有getter / setter,我想做一些类似箭头功能的操作来获取当前对象

Returning some `Map<String, BigDecimal>` doing :
(List<aDTO>).collect(Collectors.groupingBy(x -> x.bdto.id+"_"+x.bdto.cdto.id,              
                               Collectors.reducing(BigDecimal.ZERO, 
                                                   x -> x.bdto.cdto.total, 
                                                   BigDecimal::add)))

通过这里的问题来了解这些分类器/映射器 1.如何轻松访问x.bdto.id+"_"+x.bdto.cdto.id 2.如何选择x.bdto.cdto.total此字段

感谢您解开这个概念,并为我提供最佳解决方案 我想避免其他功能,例如地图/过滤器等...

0 个答案:

没有答案