Java 8地图流收集器,错误分组

Java 8地图流收集器,错误分组,java,java-8,java-stream,Java,Java 8,Java Stream,我对这两种方法的不同感到困惑,但我肯定我做错了什么 下面我有一个工作示例和一个非工作示例。在工作示例中,我将变量测试器指定为“映射”,在非工作示例中,我尝试将其指定为映射。在第二个示例中,错误如下所示: 我无法看到tester变量的类型与myMap变量的类型之间的连接 //Working Example (or at least it compiles) public String execute(Map<String, String> hostProps) {

我对这两种方法的不同感到困惑,但我肯定我做错了什么

下面我有一个工作示例和一个非工作示例。在工作示例中,我将变量测试器指定为“映射”,在非工作示例中,我尝试将其指定为映射。在第二个示例中,错误如下所示:

我无法看到tester变量的类型与myMap变量的类型之间的连接

//Working Example (or at least it compiles)
public String execute(Map<String, String>  hostProps) {
        Map tester = usages.stream()
            .map(usage -> prepareUsageForOutput(usage, rateCard.get()))
            .collect(Collectors.groupingBy(myMap -> myMap.get("meterName")));    // This case compiles
}

//Compiler Error, just by adding the Map types on line 13, it breaks line 18
public String execute(Map<String, String>  hostProps) {
        Map<String, Object> tester = usages.stream()
            .map(usage -> prepareUsageForOutput(usage, rateCard.get()))
            .collect(Collectors.groupingBy(myMap -> myMap.get("meterName")));   // In this case, the .get() method call can't resolve .get. It doesn't recognize that myMap is a Map. 
}


//This is the method that gets called in the above methods
static Map<String, Object> prepareUsageForOutput(Usage usage, RateCard rateCard ){

}
//工作示例(或至少编译)
公共字符串执行(映射hostProps){
Map tester=usages.stream()
.map(用法->准备输出(用法,rateCard.get())
.collect(Collectors.groupingBy(myMap->myMap.get(“meterName”));//此案例可编译
}
//编译器错误,只需在第13行添加映射类型,就会中断第18行
公共字符串执行(映射hostProps){
Map tester=usages.stream()
.map(用法->准备输出(用法,rateCard.get())
.collect(Collectors.groupingBy(myMap->myMap.get(“meterName”));//在这种情况下,.get()方法调用无法解析.get。它无法识别myMap是一个映射。
}
//这是在上述方法中调用的方法
静态地图准备输出(使用情况、费率卡费率卡){
}
更新1-错误的收集器方法 虽然Eran发布了对我最初问题的解释,但它表明我应该使用Collectors.toMap而不是Collectors.groupBy,因为我的目标是为从“prepare”返回的每个映射返回一个映射条目,其中键是字符串,值是从“prepare”返回的映射。groupBy将始终返回结果列表作为映射值

我还删除了filter语句,因为它们与示例无关,并且使示例变得非常复杂

这是达到我目标的最终结果:

Map<String, Object> tester = usages.stream()
     .map(usage -> prepareUsageForOutput(usage, rateCard.get()))
     .collect(Collectors.toMap(myMap ->(String)myMap.get("meterName"), Function.identity()));
Map tester=usages.stream()
.map(用法->准备输出(用法,rateCard.get())
.collect(Collectors.toMap(myMap->(String)myMap.get(“meterName”)、Function.identity());

由于
prepareUsageForOutput
返回
映射
,这意味着
收集器。groupingBy()
收集器对
进行操作,这意味着它创建的是
映射
,而不是
映射


这个答案并不能解释编译器给出的错误,但有几次我遇到了误导性的编译错误,其中涉及到
s,因此我建议将输出类型更改为
Map
,看看错误是否消失。

哇,这现在更有意义了。实际上,我希望collect()的结果是一个映射。从“准备”返回的每个地图都有一个名为“meterName”的键。我希望这些值成为最终地图中的“关键”。现在我似乎想不出实现这一目标的方法。我试过entrySet和flatmap,但我也不明白。@solvingJ确实
myMap.get(“meterName”)
返回一个
字符串
?您希望最终映射的值是什么?是的,键是一个字符串,最终映射的键与get(“meterNames”)调用的值相对应,这些值将是原始映射。我认为Function.identity()是合适的。@solvingJ我原来的答案有一个错误
groupingBy
将返回一个
Map
,而不是
Map
。是的,但你让我意识到我的想法不好。我还有第二个问题,那就是当我应该使用Collectors.toMap时,我试图使用Collectors.groupingBy。我会用最终的解决方案更新帖子。谢谢