当前位置: 首页 > 知识库问答 >
问题:

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

乔宏峻
2023-03-14

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

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

我没有看到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 ){

}

虽然Eran发布了对我的原始版本的解释,但它表明我应该使用收藏家。托马普而不是收藏家。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()));

共有1个答案

慕震博
2023-03-14

因为prepareUsageForOutput返回一个映射

这个答案并不能解释编译器给出的错误,但有几次我在涉及Streams的地方遇到了误导性的编译错误,因此我建议将输出类型更改为Map

 类似资料:
  • 我试图对对象中的每个条目执行映射操作。 我需要从键中去掉前缀,并将值从一种类型转换为另一种类型。我的代码从 映射实例并使用,这看起来很难看。 还有更好的选择吗?使用for循环似乎更好: 我应该避免使用流API吗?还是我错过了更好的方式?

  • 问题内容: Java 8中有什么方法可以将一个元素分组而不收集它们?我希望结果再次出现。因为我必须处理大量数据甚至是无限流,所以我无法先收集数据并再次流处理结果。 所有需要分组的元素在第一流中都是连续的。因此,我喜欢使流评估保持懒惰。 问题答案: 无法使用标准Stream API做到这一点。通常,您无法执行此操作,因为将来总是有可能出现属于任何已创建组的新项目,因此,在处理所有输入之前,您无法将组

  • 在Java8中有什么方法可以在中分组元素而不收集它们吗?我希望结果再次成为。因为我必须处理大量的数据,甚至是无限的流,所以我不能首先收集数据,然后再次流化结果。 所有需要分组的元素在第一个流中是连续的。因此,我喜欢保持流评估懒惰。

  • 我有这样的代码: 我写了它,但我想知道。是否可以在不创建新地图的情况下编写它。类似这样的东西(不正确的代码):

  • 我有这个方法: TableField很简单,就像: 但我看到了这个编译错误: 不兼容的类型。必需的集合,但已将“映射”推断为流:不存在类型为变量R的实例,因此流符合集合