如何创建嵌套地图 Map<String, Map<String,String>> with Stream API
How to create a nested map Map<String, Map<String,String>> with Stream API
如何编写逻辑以使用流获取 Map<String, Map<String, String>>
?
这是我试过的代码:
public Map<String, Map<String, String>> getData(Set<String> Ids) {
List<Events> events = repository.findAllByIdIn(Ids);
int i = 0;
return events.stream()
.sorted(Comparator.comparing(Events::getMajor).thenComparing(Events::getMinor))
.collect(Collectors.groupingBy(Events::getId,
//Error-Cannot resolve method 'getMajor()'
Collectors.mapping(cae -> cae.getMajor() + "." + cae.getMinor(),
cae.getDates().get(i).getEndDate() != null ? "Predicted" : "Not Predicted"),
Collectors.toMap())));//Error-Cannot resolve method 'toMap()'
}
那么如何在另一个地图中循环遍历一个地图?
收集器toMap()
与收集器toList()
和toSet()
相反不是无参数,你需要提供信息应从单个流元素中提取值。
Collectors.toMap()
需要至少两个 函数 :keyMapper
和 valueMapper
。如果可能存在重复项,您需要使用 toMap
的风格,它将 mergeFunction
作为第三个参数来解决在同一键上发生冲突的值。
因此您需要将 toMap()
作为第二个参数(下游收集器)放入 groupingBy
。这将是 collectors 和 functions:
的语法正确结构
Collectors.groupingBy(classifier, Collectors.toMap(keyMapper, valueMapper))
以及代码可能的样子:
return events.stream()
.sorted(Comparator.comparing(Events::getMajor)
.thenComparing(Events::getMinor))
.collect(Collectors.groupingBy(Events::getId,
Collectors.toMap(cae -> cae.getMajor() + "." + cae.getMinor(),
cae -> cae.getDates().get(i).getEndDate() != null ?
"Predicted" : "Not Predicted")));
注意,Collectors.mapping()
不是要生成Map
而是要转换的元素流,您可以将其视为 map()
操作的模拟,它不是在流管道的中间完成的,而是在收集数据的过程中完成的。
如果我理解你的逻辑是正确的,那么这里就没有必要应用mapping()
了。
如何编写逻辑以使用流获取 Map<String, Map<String, String>>
?
这是我试过的代码:
public Map<String, Map<String, String>> getData(Set<String> Ids) {
List<Events> events = repository.findAllByIdIn(Ids);
int i = 0;
return events.stream()
.sorted(Comparator.comparing(Events::getMajor).thenComparing(Events::getMinor))
.collect(Collectors.groupingBy(Events::getId,
//Error-Cannot resolve method 'getMajor()'
Collectors.mapping(cae -> cae.getMajor() + "." + cae.getMinor(),
cae.getDates().get(i).getEndDate() != null ? "Predicted" : "Not Predicted"),
Collectors.toMap())));//Error-Cannot resolve method 'toMap()'
}
那么如何在另一个地图中循环遍历一个地图?
收集器toMap()
与收集器toList()
和toSet()
相反不是无参数,你需要提供信息应从单个流元素中提取值。
Collectors.toMap()
需要至少两个 函数 :keyMapper
和 valueMapper
。如果可能存在重复项,您需要使用 toMap
的风格,它将 mergeFunction
作为第三个参数来解决在同一键上发生冲突的值。
因此您需要将 toMap()
作为第二个参数(下游收集器)放入 groupingBy
。这将是 collectors 和 functions:
Collectors.groupingBy(classifier, Collectors.toMap(keyMapper, valueMapper))
以及代码可能的样子:
return events.stream()
.sorted(Comparator.comparing(Events::getMajor)
.thenComparing(Events::getMinor))
.collect(Collectors.groupingBy(Events::getId,
Collectors.toMap(cae -> cae.getMajor() + "." + cae.getMinor(),
cae -> cae.getDates().get(i).getEndDate() != null ?
"Predicted" : "Not Predicted")));
注意,Collectors.mapping()
不是要生成Map
而是要转换的元素流,您可以将其视为 map()
操作的模拟,它不是在流管道的中间完成的,而是在收集数据的过程中完成的。
如果我理解你的逻辑是正确的,那么这里就没有必要应用mapping()
了。