【发布时间】:2020-08-26 23:48:45
【问题描述】:
我想将下面的 for 循环转换为 Java 8。但是在过滤状态列表和分组为一个状态和总数时遇到问题。
我试过了,但是对于每个"LIVE"、"DRAFT"、"TEST" 必须循环 3 次并获得 3 个不同的地图。使用Java-8是否可以进入一个循环?
其中"LIVE"、"DRAFT" 和"TEST" 又是来自workflowInstance 的状态组合,例如DRAFT = {"DRAFT_EDIT","DRAFT_SAVE"}。我想根据定义的这个组合将所有状态分类为 3。
Map<String, Integer> summaryMap = new HashMap<>();
int l = 0, d = 0, t = 0;
for (WorkflowInstance instance : workflowInstances) {
if (liveStatuses.contains(instance.getStatus())) {
summaryMap.put("LIVE", l++);
} else if (testStatuses.contains(instance.getStatus())) {
summaryMap.put("TEST", t++);
} else if (draftStatuses.contains(instance.getStatus())) {
summaryMap.put("DRAFT", d++);
}
}
Java-8 分别用于 "LIVE"、"DRAFT" 和 "TEST":
map.put("DRAFT", workflowInstances.stream()
.filter(inst-> Constants.DRAFT_STATUS.contains(inst.getStatus()))
.collect(Collectors.groupingBy(WorkflowInstance::getStatus, Collectors.counting()))
.entrySet().stream().mapToLong(e-> e.getValue()).sum()
);
map.put("LIVE", workflowInstances.stream()
.filter(inst-> Constants.LIVE_STATUS.contains(inst.getStatus()))
.collect(Collectors.groupingBy(WorkflowInstance::getStatus, Collectors.counting()))
.entrySet().stream().mapToLong(e-> e.getValue()).sum()
);
// Similar for "TEST"
我不想循环 3 次,而是想一次性完成并对它们进行分类。 任何帮助将不胜感激。
【问题讨论】:
-
我不确定我是否理解正确,但我认为您不需要过滤任何内容。只需收集 groupingBy 就可以了 - 你得到了一张以状态为键并计为值的地图。
-
我想从 workflowInstance 对象中过滤状态,例如 DRAF_EDIT、DRAFT_SAVE 等,但想将它们组合为 DRAFT。
-
您的
summaryMap已经拥有此信息。为什么要进一步处理?
标签: java dictionary java-8 java-stream