gpt4 book ai didi

java - 使用 Java 流 API 将 Map> 转换为 Map>>

转载 作者:行者123 更新时间:2023-11-30 01:53:55 25 4
gpt4 key购买 nike

我从数据库收到一些结果集,并将每一行存储为 DbRow 类型的对象,这是类:

public class DbRow {

private int clientNumber;
private String recordNumber;
private String takeoverMonth;
private int takeovers;
private int mainClaims;
private int distinctContractDates;
private LocalDate contractDate;

public DbRow(int clientNumber, String recordNumber, String takeoverMonth, int takeovers,
int mainClaims, int distinctContractDates, LocalDate contractDate) {
super();
this.clientNumber = clientNumber;
this.recordNumber = recordNumber;
this.takeoverMonth = takeoverMonth;
this.takeovers = takeovers;
this.mainClaims = mainClaims;
this.distinctContractDates = distinctContractDates;
this.contractDate = contractDate;
}

// getters & setters

// hashCode, equals & toString
}

我目前将收到的对象存储在 Map<Integer, List<DbRow>> 中为了让它们由某个属性分隔(在本例中 clientNumber ,所有具有特定客户端编号的 DbRow 都存储在 List<DbRow>> 中,而它们的 key 就是这个特定客户端编号)。

我需要创建一个Map<Integer, Map<String, Map<LocalDate, Integer>>>我目前使用很多行代码来完成此操作。

期望的结果可以描述为
每个客户数量的每个收购月的不同契约(Contract)日期的数量
(如 Map< 客户编号 , Map< 接管月份 , Map< 契约(Contract)日期 , 计数 >>> )
其中接管月份是 String格式 "yyyy/MM" .

我当前的解决方案很丑陋,但有效。它包含子图的创建和填充以及检查我想要删除的现有键。请看一下:

Map<Integer, List<DbRow>> records = new TreeMap<>();

// fill records with database results ...

Map<Integer, Map<String, Map<LocalDate, Integer>>> results = new TreeMap<>();

records.forEach((clientNumber, dbRows) -> {
Map<String, List<DbRow>> rowsPerMonth = dbRows.stream()
.collect(Collectors.groupingBy(DbRow::getTakeoverMonth));
Map<String, Map<LocalDate, Integer>> monthResults = new TreeMap<>();

rowsPerMonth.forEach((takeoverMonth, rows) -> {
if (monthResults.containsKey(takeoverMonth)) {
Map<LocalDate, Integer> contractDateCount = monthResults.get(takeoverMonth);
rows.forEach(dbRow -> {
LocalDate contractDate = dbRow.getContractDate();
if (contractDateCount.containsKey(contractDate)) {
int count = contractDateCount.get(contractDate);
count++;
contractDateCount.put(contractDate, count);
} else {
contractDateCount.put(contractDate, 1);
}
});
monthResults.put(takeoverMonth, contractDateCount);
} else {
Map<LocalDate, Integer> contractDateCount = new TreeMap<>();
rows.forEach(dbRow -> {
LocalDate contractDate = dbRow.getContractDate();
if (contractDateCount.containsKey(contractDate)) {
int count = contractDateCount.get(contractDate);
count++;
contractDateCount.put(contractDate, count);
} else {
contractDateCount.put(contractDate, 1);
}
});
monthResults.put(takeoverMonth, contractDateCount);
}
});

results.put(clientNumber, monthResults);
});

有人知道(如果有)一种使用流 API 以更短的方式完成此操作的方法吗?我真的很想有一个漂亮的解决方案。

最佳答案

您可能正在寻找类似的东西:

Map<Integer, Map<String, Map<LocalDate, Long>>>  countDistinctDatesPerMonthPerClient(List<DbRow> input) {
return input.stream()
.collect(Collectors.groupingBy(DbRow::getClientNumber,
Collectors.groupingBy(DbRow::getTakeoverMonth,
Collectors.groupingBy(DbRow::getContractDate, Collectors.counting()))));
}

关于java - 使用 Java 流 API 将 Map<Integer, List<Object>> 转换为 Map<Integer, Map<String, Map<LocalDate, Integer>>>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55138518/

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