Java 8流分组 如果只有一个分组值对象,如何设置字段?

安东·科洛索克(Anton Kolosok):

我有课

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**)

帮助请

Code_Mode:

币种未设置为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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章