我对这两种方法的不同感到困惑,但我肯定我做错了什么。
下面我有一个工作示例和一个非工作示例。在工作示例中,我将变量测试器指定为“映射”,在非工作示例中,我尝试将其指定为映射。在第二个示例中,错误如下所示:
我没有看到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()));
因为prepareUsageForOutput
返回一个映射
这个答案并不能解释编译器给出的错误,但有几次我在涉及
Stream
s的地方遇到了误导性的编译错误,因此我建议将输出类型更改为Map
我有两张地图
我试图对对象中的每个条目执行映射操作。 我需要从键中去掉前缀,并将值从一种类型转换为另一种类型。我的代码从 映射实例并使用,这看起来很难看。 还有更好的选择吗?使用for循环似乎更好: 我应该避免使用流API吗?还是我错过了更好的方式?
问题内容: Java 8中有什么方法可以将一个元素分组而不收集它们?我希望结果再次出现。因为我必须处理大量数据甚至是无限流,所以我无法先收集数据并再次流处理结果。 所有需要分组的元素在第一流中都是连续的。因此,我喜欢使流评估保持懒惰。 问题答案: 无法使用标准Stream API做到这一点。通常,您无法执行此操作,因为将来总是有可能出现属于任何已创建组的新项目,因此,在处理所有输入之前,您无法将组
在Java8中有什么方法可以在中分组元素而不收集它们吗?我希望结果再次成为。因为我必须处理大量的数据,甚至是无限的流,所以我不能首先收集数据,然后再次流化结果。 所有需要分组的元素在第一个流中是连续的。因此,我喜欢保持流评估懒惰。
我有这样的代码: 我写了它,但我想知道。是否可以在不创建新地图的情况下编写它。类似这样的东西(不正确的代码):
我有这个方法: TableField很简单,就像: 但我看到了这个编译错误: 不兼容的类型。必需的集合,但已将“映射”推断为流:不存在类型为变量R的实例,因此流符合集合