简体   繁体   English

按流java 8中的多个字段分组

[英]Group by multiple fields in stream java 8

I have a class:我有一堂课:

    public class PublicationDTO {

     final String publicationName;
     final String publicationID;
     final String locale;
     final Integer views;
     final Integer shares;
}

A need to get sum of views and shares.需要获得观点和分享的总和。 For test i created a list:为了测试,我创建了一个列表:

        PublicationDTO publicationDTO1 = new PublicationDTO("Name1", "name1", "CA", 5, 6);
        PublicationDTO publicationDTO2 = new PublicationDTO("Name2", "name2", "US", 6, 3);
        PublicationDTO publicationDTO3 = new PublicationDTO("Name1", "name1", "CA", 10, 1);
        PublicationDTO publicationDTO4 = new PublicationDTO("Name2", "name2", "CA", 2, 3);

        List<PublicationDTO> publicationDTOS = List.of(publicationDTO1, publicationDTO2, publicationDTO3, publicationDTO4);

I want to group objects in list by publicationName, publicationId and locale and get result list like:我想按publicationName、publicationId和locale对列表中的对象进行分组,并获得如下结果列表:

List.of(new PublicationDTO("Name1", "name1", "CA", 15, 7),
        new PublicationDTO("Name2", "name2", "CA", 2, 3),
        new PublicationDTO("Name2", "name2", "US", 6, 3));

I found a solution like:我找到了一个解决方案,例如:

List<PublicationDTO> collect = publicationDTOS.stream()
            .collect(groupingBy(PublicationDTO::getPublicationID))
            .values().stream()
            .map(dtos -> dtos.stream()
                    .reduce((f1, f2) -> new PublicationDTO(f1.publicationName, f1.publicationID, f1.locale, f1.views + f2.views, f1.shares + f2.shares)))
            .map(Optional::get)
            .collect(toList());

but the result not grouped by locale and I'm not sure if it works by publicationId.但结果未按语言环境分组,我不确定它是否按publicationId 工作。 Please let me know how to properly use collectors in such case?请让我知道在这种情况下如何正确使用收集器?

You are only grouping by getPublicationID :您仅按getPublicationID分组:

.collect(groupingBy(PublicationDTO::getPublicationID))

Since those fields you are interested in for grouping are all strings you could concatenate them and use that as a grouping classifier:由于您对分组感兴趣的那些字段都是字符串,您可以将它们连接起来并将其用作分组分类器:

.collect(Collectors.groupingBy(p -> p.getPublicationName() + p.getPublicationID() + p.getLocale()))

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM