我有一个主题:
@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);它在输出中具有例如:
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)
我试图实现的是过滤我的结果输出为(如果日期&用户是相同的加分点)
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。
return topics.stream()
.collect(Collectors.groupingBy(Topic::getDate,
Collectors.summingInt(Topic::getPoints)));
也许在这种情况下,有另一种方法可以代替map返回创建的dto?例如:
@Data
public class ResultDto {
private LocalDate date;
private String name;
private int points;
private User user;
}
发布于 2018-09-11 03:53:38
按字段子集分组的一种简单方法是使用带有自定义Comparator
的TreeMap
。假设你要定义
Comparator<Topic> byDateAndUser = Comparator.comparing(Topic::getDate)
.thenComparing(t -> t.getUser().getUserId());
Map<Topic,...> map = new TreeMap<>(byDateAndUser);
结果映射将使用提供的比较器而不是equals
来确定相等,从而将具有相同日期和用户的所有主题视为相同。
TreeMap
的此功能允许您计算总分的主题地图,并且对于每个日期/用户组合,它将仅包含一个条目:
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)
));
https://stackoverflow.com/questions/52260488
复制相似问题