我有一个 Enum
所有状态如下:
enum Status {
ACCEPTED("Accepted"),
REJECTED("Rejected"),
FAILED("Failed");
private final String label;
Status(final String label) {
this.label = label;
}
}
Map我从数据库运行的查询结果的模型:
public class Summary {
private LocalDate date;
private Status status;
private int count;
}
假设我的数据库返回以下内容,不包括 Rejected
24日和 Failed
第27名:
DATE | status | count
20-01-24 | Accepted | 1
20-01-24 | Failed | 40
20-01-27 | Accepted | 10
20-01-27 | Rejected | 15
我怎么还可以包括 rejected
& failed
与上述日期一起的日期?
我称db为:
final List<Summary> statuses = this.dbRepo.getSummaries(someCriteria);
但这份清单不包括 Rejected
& Failed
因为db没有返回它们。
通过Java8和流操作,是否有方法检查所有可用的枚举值 Status
而在那里有一个状态缺失 statuses
对于日期,包括计数0?
到目前为止,我一直在尝试从db获取结果,并将这些结果放入一个Map中,如下所示:
public Map<LocalDate, List<Summary>> getSummaries(final SomeCriteria someCriteria) {
return this.namedParameterJdbcTemplate.query(this.QUERY,
new MapSqlParameterSource()
.addValue("date", someCriteria.getFrom())
((rs, rowNum) -> Summary.builder()
.date(rs.getDate("date").toLocalDate())
.status(valueOfLabel(rs.getString("status")))
.count(rs.getInt("count"))
.build())
).stream().collect(groupingBy(Summary::getDate));
}
3条答案
按热度按时间crcmnpdw1#
这是我将分两步做的事情,在一个穷人版本的笛卡尔自连接中(在预先分组的数据上):
上面列出:
umuewwlo2#
一步一个脚印地做这件事也许是可能的,但我认为它不会那么易读!分几步做,我要说清楚!
第一步:按日期和状态属性分组。
{2020-01-27=[接受,拒绝],2020-01-24=[失败,接受]}
在第二步中,组摘要包含日期和可用状态。
最后一步加上
summary
缺席status
.合并方法:
输出:
eoxn13cs3#
可以使用嵌套
grouping
创建初始查找Map
```Map<LocalDate, Map<Status, Summary>> lookup = statuses.stream()
.collect(Collectors.groupingBy(Summary::getDate,
Collectors.toMap(Summary::getStatus, Function.identity())));
List overallResult = lookup.entrySet().stream()
.flatMap(en -> EnumSet.allOf(Status.class).stream()
.map(status -> en.getValue().containsKey(status) ?
en.getValue().get(status) : Summary.builder()
.date(en.getKey()).status(status).count(0).build()))
.collect(Collectors.toList());
Summary(date=2020-01-27, status=ACCEPTED, count=10)
Summary(date=2020-01-27, status=REJECTED, count=15)
Summary(date=2020-01-27, status=FAILED, count=0)
Summary(date=2020-01-24, status=ACCEPTED, count=1)
Summary(date=2020-01-24, status=REJECTED, count=0)
Summary(date=2020-01-24, status=FAILED, count=40)