Collections Java汇总基于属性的项目列表

Collections Java汇总基于属性的项目列表,collections,java-8,java-stream,Collections,Java 8,Java Stream,给定一个类项目,如下所示: Class item { private Date date; private String id; private Double value; // getter and setter... } 我想创建一个函数,该函数遍历项目列表,并对具有相同日期和id的项目的值求和,然后返回id列表和值的和 public Map<String, Double> process(List<Item> listItems, Date today)

给定一个类项目,如下所示:

Class item {
 private Date date;
 private String id;
 private Double value;

 // getter and setter...
}
我想创建一个函数,该函数遍历项目列表,并对具有相同日期和id的项目的值求和,然后返回id列表和值的和

public Map<String, Double> process(List<Item> listItems, Date today) {
 // return list with ID and sum of the value for all the items group by ID and where the date equals the date in parameter.
}
公共地图流程(列出列表项,日期为今天){
//返回ID为的列表以及按ID分组的所有项目的值之和,其中日期等于参数中的日期。
}
到目前为止,我已经研究了Java 8函数流和收集,并且能够做到这一点:

Map<String, Double> map = listTransactions.stream()
                .collect(Collectors.groupingBy(Item::getId, Collectors.summingDouble(Item::getValue)));
Map Map=listTransactions.stream()
.collect(Collectors.groupingBy(Item::getId,Collectors.summingDouble(Item::getValue));
这是很好的工作组由id,但我不知道如何过滤的日期现在,所以任何帮助将不胜感激

否则我可以用一个基本循环来完成,但我想找到一个更好的方法,如果可能的话,使用Java 8。

您可以这样做

Map<String, Map<LocalDateTime, Double>> result = items.stream()
        .collect(Collectors.groupingBy(Item::getId,
                Collectors.groupingBy(Item::getDate, Collectors.summingDouble(Item::getValue))));
Map result=items.stream()
.collect(收集器).groupingBy(项::getId,
Collectors.groupby(Item::getDate,Collectors.summingDouble(Item::getValue));
但是结果类型与您需要的不完全相同。在这种情况下,它是
Map


不管怎样,我的问题是,在这种情况下,如何处理相同的Id值和不同的日期值?您将如何处理该冲突?

之前添加
.filter(item->today.equals(item.getDate())
。collect(…)
?这实际上是一个非常好的主意,您知道这是否可以对实际总和应用另一个条件吗?(如总和(值)>1000)?对结果进行流式处理并根据您的喜好进行过滤。或者将结果放入可变映射并
map.values().removeIf(sum->sum谢谢Misha!这就是我目前正在做的事情,但我想知道我是否可以用更好的方式来做。仅供参考,非常麻烦的旧日期时间类,例如,和
java.text.SimpleDataFormat
,现在被java 8和更高版本中内置的类所取代。请参阅。