首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Java8中用groupingBy & summingInt扩展流的输出

在Java8中用groupingBy & summingInt扩展流的输出
EN

Stack Overflow用户
提问于 2018-09-10 22:54:02
回答 1查看 795关注 0票数 3

我有一个主题:

代码语言:javascript
复制
@Entity
public class Topic {
    @Id
    private int id;
    private LocalDate date;
    private String name;
    private int points;
    @JoinColumn(name = "user_id", nullable = false)
    private User user;
}

我正在通过spring data jpa方法获取给定日期的主题列表:

List topics = topicRepository.findByDateBetween(begin,end);它在输出中具有例如:

代码语言:javascript
复制
Topic(id=1, date="2018-01-01", name="Java examples", User(...), 12)
Topic(id=2, date="2018-02-02", name="Java examples", User(...), 34)
Topic(id=3, date="2018-02-02", name="Java examples", User(...), 56)
Topic(id=4, date="2018-03-03", name="Java examples", User(...), 78)
Topic(id=5, date="2018-03-03", name="Java examples", User(...), 90)

我试图实现的是过滤我的结果输出为(如果日期&用户是相同的加分点)

代码语言:javascript
复制
Topic(id=1, date="2018-01-01", name="Java examples", User(...), 12)
Topic(id=2, date="2018-02-02", name="Java examples", User(...), 90)
Topic(id=4, date="2018-03-03", name="Java examples", User(...), 168)

我的实际解决方案返回map,以date作为键,以求和点数作为值,但是我需要在输出中给出更多的数据,比如User或name。

代码语言:javascript
复制
return topics.stream()
        .collect(Collectors.groupingBy(Topic::getDate,
                Collectors.summingInt(Topic::getPoints)));

也许在这种情况下,有另一种方法可以代替map返回创建的dto?例如:

代码语言:javascript
复制
@Data
public class ResultDto {
    private LocalDate date;
    private String name;
    private int points;
    private User user;
}
EN

回答 1

Stack Overflow用户

发布于 2018-09-11 03:53:38

按字段子集分组的一种简单方法是使用带有自定义ComparatorTreeMap。假设你要定义

代码语言:javascript
复制
Comparator<Topic> byDateAndUser = Comparator.comparing(Topic::getDate)
            .thenComparing(t -> t.getUser().getUserId());

Map<Topic,...> map = new TreeMap<>(byDateAndUser);

结果映射将使用提供的比较器而不是equals来确定相等,从而将具有相同日期和用户的所有主题视为相同。

TreeMap的此功能允许您计算总分的主题地图,并且对于每个日期/用户组合,它将仅包含一个条目:

代码语言:javascript
复制
import static java.util.stream.Collectors.groupingBy;
import static java.util.stream.Collectors.summingInt;

Comparator<Topic> byDateAndUser = Comparator.comparing(Topic::getDate)
            .thenComparing(t -> t.getUser().getUserId());

Map<Topic, Integer> pointTotals = topics.stream()
        .collect(groupingBy(
                topic -> topic, 
                () -> new TreeMap<>(byDateAndUser), 
                summingInt(Topic::getPoints)
        ));
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52260488

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档