3 回答
TA贡献1842条经验 获得超12个赞
根据您的描述,fullList 中应该有 4 个列表(第 1 个 III 和组合、第 2 个 IV 和组合、第 3 个 II 和国内、第 4 个 IV 和国内)我假设您正在寻找这个:
Function<Target, List<String>> riskLevelAndLocation = t -> List.of(t.getRiskLevel(), t.getLocation());
Map<List<String>, List<Target>> fullList = ucrtargetList.stream()
.collect(Collectors.groupingBy(riskLevelAndLocation));
riskLevelAndLocation是 a Function,它返回一个List包含riskLeveland location。groupingBy一个List作品因为List.equals(Object o)
返回true当且仅当该指定的对象也是一个列表,两个列表具有相同的大小,并且在两个列表元素的所有相应的对是相等。
快速检查:
for (Entry<List<String>, List<Target>> entrySet : fullList.entrySet()) {
System.out.println(entrySet.getKey().toString() + ": " + entrySet.getValue().size());
}
输出是:
[IV, Combined]: 3
[II, Domestic]: 1
[III, Combined]: 4
[IV, Domestic]: 4
如果fullList必须具有您描述的顺序,那么您可以使用 aLinkedHashMap并对其进行排序。
TA贡献1719条经验 获得超6个赞
还不能发表评论,所以添加一个答案,以扩展@Schedu Luca 的回答,'groupingBy' 子句可以链接起来,像这样
Map<String, List<Target>> collect = ucrtargetList.stream() .collect(Collectors.groupingBy(Target::getRisklevel, Collectors.groupingBy(Target::getLocation)));
TA贡献1836条经验 获得超3个赞
List<List<Target>> fullList = ucrtargetList.stream() .collect(Collectors.groupingBy(Target::getRisklevel)) // Or another collector .entrySet() .stream() .map(Map.Entry::getValue) .collect(Collectors.toList());
如果要从结果中删除相同的对象,则需要添加方法 'equals' 和 'hashcode' 并收集到 Set。
添加回答
举报