java - 将项目收集到括号中(当前组和所有先前组)
问题描述
(抱歉,如果“括号”一词令人困惑,我将其取自荷兰语翻译的“税级”)。
如何根据属性阈值将项目收集到组和每个前面的组中?
例子:
Loan A, duration of 6 months
Loan B, duration of 10 months
Loan C, duration of 12 months
结果为Map<Integer, List<Loan>>
:
6 -> {A, B, C}
10 -> {B, C}
12 -> {C}
目前我正在使用 LinkedHashMap 路线,然后在从流中收集项目后,遍历所有组以更新它们:
Map<Integer, List<Loan>> loansByDuration = loans.stream()
.collect(groupingBy(Loan::getDuration, LinkedHashMap::new, toList()));
List<Loan> previousGroup = null;
for (List<Loan> currentGroup : loansByDuration.values()) {
if (previousGroup != null) {
currentGroup.addAll(previousGroup);
}
previousGroup = currentGroup;
}
所以我正在做的是地图中的每个后续列表值都将包含所有以前的贷款加上仅与相应的持续时间键相关的贷款。类似于累积小计。
这可以通过标准 API 或自定义收集器之类的东西来完成吗?
解决方案
对于用例,是否有必要使用类似的类型Map<Integer, List<Loan>>
?因此,每个列表都将包含所有以前的贷款。这意味着会有对Loan
.
或者是提供关于loans
分组的视图的用例duration
?
在这种情况下,我们可以使用另一种方法:贷款视图使用Stream
(基于 Java 9+)。
public class Loans {
private final List<Loan> loans;
public Loans(List<Loan> loans) {
this.loans = loans.stream()
.sorted(Comparator.comparingInt(Loan::getDuration))
.collect(Collectors.toList());
}
public Stream<Loan> getUpTo(int duration) {
return loans.stream().takeWhile(l -> l.getDuration() <= duration);
}
}
由于我们有 a List<Loan>
sorted by,duration
我们可以使用Stream.takeWhile
a 来获取某个sStream
的所需Loan
s duration
。
这可以像这样工作:
Loans loans = new Loans(List.of(new Loan("A", 6), new Loan("B", 10), new Loan("C", 12));
loans.getUpTo(1); // <empty>
loans.getUpTo(5); // <empty>
loans.getUpTo(6); // Loan("A", 6)
loans.getUpTo(10); // Loan("A", 6), new Loan("B", 10)
loans.getUpTo(11); // Loan("A", 6), new Loan("B", 10)
loans.getUpTo(12); // Loan("A", 6), new Loan("B", 10), Loan("C", 12)
loans.getUpTo(100); // Loan("A", 6), new Loan("B", 10), Loan("C", 12)
如果List<Loan>
需要 a ,我们仍然可以collect
使用流式元素toList()
。
推荐阅读
- php - 微服务客户端循环依赖
- python - 对数据集进行分层,同时避免索引污染?
- c# - C# EF Core Web Api 扩展在实体上为空
- python - 为数据集中的行创建直方图,分类为 1 和 0
- ruby-on-rails - 无法使用 SSL nginx 反向代理在 Rails 6 中验证 CSRF 令牌的真实性
- javascript - 在解构赋值之前声明对象属性类型
- python - 如何在熊猫中保存与特定条件匹配的先前结果
- eclipse-jdt - 使用 AST 删除已实现的接口
- javascript - 运行测试以查看是否显示数字
- vue.js - 在 Nuxt 中为 workbox 动态生成 preCache 文件