【发布时间】:2018-10-16 09:22:59
【问题描述】:
(对不起,如果“括号”一词令人困惑,我是从荷兰语翻译的“税括号”中提取的)。
如何根据属性阈值将项目收集到组和每个前面的组?
例子:
Loan A, duration of 6 months
Loan B, duration of 10 months
Loan C, duration of 12 months
结果为@987654322@:
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 或自定义收集器之类的东西来完成吗?
【问题讨论】:
-
addAll在这里想要达到什么目的?你为什么不在空的初始化列表上做addAll部分? -
如果你会用番石榴,有
RangeMap -
@Eugene,我确实可以使用番石榴。我会看看它,但同时随时用番石榴提供答案:)
-
@nullpointer,我不明白这将如何完成同样的事情。我正在做的是地图中的每个后续列表值都将包含所有以前的贷款加上仅与相应的持续时间键相关的贷款。就像累积小计一样。
-
@Eugene,RangeMap 被标记为 Beta/Unstable。不要认为在我的情况(企业)中使用它是一个好主意。
标签: java java-stream collectors