溪流Java 8中的多个字段组。

发布于 2025-02-04 17:57:47 字数 1581 浏览 2 评论 0原文

我有一个课程:

    public class PublicationDTO {

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

需要获得视图和分享的总和。对于测试,我创建了一个列表:

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

我想按PublicationName,publication Id和locale和获取结果列表中的列表中的对象:

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

我找到了一个解决方案:

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

但是结果未按Locale分组,我不确定它是否由Publication Id工作。在这种情况下,请让我知道如何正确使用收藏家?

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:

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. Please let me know how to properly use collectors in such case?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

手长情犹 2025-02-11 17:57:47

您仅通过getPublicationId进行分组:

.collect(groupingBy(PublicationDTO::getPublicationID))

由于您对分组感兴趣的那些字段都是所有字符串,因此您可以将它们串联,并将其用作分组分类器:

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

You are only grouping by 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()))
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文