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

时间:2019-11-27 08:24:28

标签: java java-8 stream java-stream

我上课

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(因为如果对象只有一个,则减少不起作用。)所以这是我的问题。

如果我有:

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

帮助请

1 个答案:

答案 0 :(得分:3)

币种未设置为0,因为pip install pandas 不会被评估为单次接收结果。如果要将所有货币设置为0,则将其映射为0,如下所示,

reducing

@Holger正确指出,您可能要使用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();

toMap

希望有帮助。