- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个主题:
@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 ,但我需要在输出中提供更多数据,如用户或名称。
return topics.stream()
.collect(Collectors.groupingBy(Topic::getDate,
Collectors.summingInt(Topic::getPoints)));
也许有另一种方法可以代替 map return 为这种情况创建 dto?例如
@Data
public class ResultDto {
private LocalDate date;
private String name;
private int points;
private User user;
}
最佳答案
按字段子集分组的一种简单方法是使用带有自定义 Comparator
的 TreeMap
。假设你要定义
Comparator<Topic> byDateAndUser = Comparator.comparing(Topic::getDate)
.thenComparing(t -> t.getUser().getUserId());
Map<Topic,...> map = new TreeMap<>(byDateAndUser);
生成的 map 将使用提供的比较器而不是 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)
));
关于java-8 - 在 Java8 中使用 groupingBy 和 summingInt 扩展流的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52260488/
我试图从 summingInt() 中的 EndTime 中减去 StartTime,但它不起作用,它告诉我“这个表达式的目标类型必须是一个函数式接口(interface)”。 Map hm = ne
我目前正在创建一个 Map>像这样,其中 Integer代表秒: Map> map = stream.collect(Collectors.groupingBy( x -> x
当您想对流中的整数值求和时,主要有两种方法: ToIntFunction mapFunc = ... int sum = stream().collect(Collectors.summingInt(
标准收集器 summingInt 在内部创建一个长度为 1 的数组: public static Collector summingInt(ToIntFunction mapper) { r
我有一个主题: @Entity public class Topic { @Id private int id; private LocalDate date; pri
我有自己的类 CheckIn,属性 day 为 String,workingHours 为 int 和 inProgress 为 boolean: public class CheckIn {
我是一名优秀的程序员,十分优秀!