如何创建嵌套地图 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() 需要至少两个 函数 keyMappervalueMapper。如果可能存在重复项,您需要使用 toMap 的风格,它将 mergeFunction 作为第三个参数来解决在同一键上发生冲突的值。

因此您需要将 toMap() 作为第二个参数(下游收集器)放入 groupingBy。这将是 collectorsfunctions:

的语法正确结构
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()了。