gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 07:39:47 25 4
gpt4 key购买 nike

我有课

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

请帮忙

最佳答案

货币未设置为 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();

希望对您有所帮助。

关于Java 8 流分组。如果只有一个分组值对象,如何设置字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59065938/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com