我正在尝试将双打列表流式传输到Map<Double, Double>
,其中键是原始列表中的双打,值是一些计算值。
这就是我的代码:
// "values" is a List<Double> that was passed in
ImmutableMap<Double, Double> valueMap = values.parallelStream()
.collect(Collectors.toMap(p -> p, p -> doThing(values, p)));
private Double doThing(List<Double>, Double p) {
Double computedValue = 0.0;
// Do math here with p
return computedValue;
}
然而,IntelliJ抱怨p -> p
不是有效的lambda表达式 - 它抱怨循环推理。我调用doThing
时也遇到错误,因为p
是lambda参数而不是Double。
当我尝试在p
的调用中将Double
投射到doThing
时,无法投射。
我错过了一些非常明显的东西吗?似乎没有办法真正对我的lambda参数做任何事情......
答案 0 :(得分:6)
我认为这里的问题只是您的收集操作返回Map<Double, Double>
,但valueMap
的类型为ImmutableMap<Double, Double>
。
您还忘记在List<Double>
中为doThing
参数命名,但我认为在撰写问题时这只是一个错字。
答案 1 :(得分:1)
如前所述,问题在于Collectors.toMap
会将元素累积到Map<K,U>
中(当前实现返回HashMap
但它是内部细节。)
如果您想收集到ImmutableMap
,可以使用collectingAndThen
收集器。
使用Collectors.toMap
作为下游收集器并提供函数map -> ImmutableMap.copyOf(map)
作为终结器。
ImmutableMap<Double, Double> valueMap = values.stream()
.collect(collectingAndThen(toMap(p -> p, p -> doThing(values, p)), ImmutableMap::copyOf));