我有课
public class SomeClass {
private String date;
private int players;
private int currency;
// getters setters omitted for brevity
}
我已经收集了这些对象。现在,我想按日期对这个对象进行分组,对玩家总数进行计数,并将currencyId设置为0。
list = list.stream()
.collect(
groupingBy(SomeClass::getDate,
collectingAndThen(reducing((a, b) -> {
a.setDate(a.getDate());
a.setPlayers(a.getPlayers() + b.getPlayers());
a.setCurrency(0);
return a;
}), Optional::get)))
.values();
除非我只有一个特定日期的对象,否则一切都很好。该对象未将货币设置为0(因为如果对象仅为1,则减少不起作用。)所以这是我的问题。
如果我有:
Object1 ("11.09", 12, 12)
Object2 ("11.09", 8, 13)
Object3 ("12.09", 1, 2)
Object4 ("12.09", 0, 1)
Object5 ("13.09", 12, 12)
输出必须是:
Object6 ("11.09", 20, 0)
Object7 ("12.09", 1, 0)
Object8 ("13.09", 12, **0**)
但反而:
Object6 ("11.09", 20, 0)
Object7 ("12.09", 1, 0)
Object8 ("13.09", 12, **12**)
帮助请
币种未设置为0,因为reducing
不会对单个消息结果进行评估。如果要将所有货币设置为0,则将其映射为0,如下所示,
list.stream().map(ele->{ele.setCurrency(0);return ele;}).collect(
groupingBy(SomeClass::getDate,
collectingAndThen(reducing((a, b) -> {
a.setPlayers(a.getPlayers() + b.getPlayers());
return a;
}), Optional::get)))
.values();
正如@Holger正确指出的那样,您可能需要使用toMap
,
list.stream()
.map(ele->{ele.setCurrency(0);return ele;})
.collect(toMap(SomeClass::getDate, Function.identity(), (a, b) -> {
a.setPlayers(a.getPlayers() + b.getPlayers());
return a;
})).values();
希望能帮助到你。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句