如何将lambda参数转换为可用对象?

时间:2015-10-28 20:35:40

标签: java lambda java-8 java-stream

我正在尝试将双打列表流式传输到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参数做任何事情......

2 个答案:

答案 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));