Java中lambda表达式内部的类型转换?

Java中lambda表达式内部的类型转换?,java,lambda,casting,Java,Lambda,Casting,我在Java8下使用SpringBoot,我试图在lambda表达式中执行类型转换,但经过大量研究和尝试/错误后,无法使其工作 假设我有这样一个列表: List<Foo> list; public Double getQuantityAsDouble() { return StringUtils.isEmpty(quantity) ? new Double(0) : Double.valueOf(quantity); } 加载列表后,我需要根据id进行分组和求和,因为数量

我在Java8下使用SpringBoot,我试图在lambda表达式中执行类型转换,但经过大量研究和尝试/错误后,无法使其工作

假设我有这样一个列表:

List<Foo> list;
public Double getQuantityAsDouble() {
    return StringUtils.isEmpty(quantity) ? new Double(0) : Double.valueOf(quantity);
}
加载列表后,我需要根据id进行分组和求和,因为数量字符串表示十进制数

以下代码给了我一个错误,因为summingDouble需要的是一个Double,而不是字符串:

Map<String, Double> grouping = list.stream().collect(Collectors.groupingBy(Foo::getId, Collectors.summingDouble(Foo::getQuantity)));
这样打电话:

Map<String, Double> grouping = list.stream().collect(Collectors.groupingBy(Foo::getId, Collectors.summingDouble(Foo::getQuantityAsDouble)));
Map grouping=list.stream().collect(Collectors.groupingBy(Foo::getId,Collectors.summingDouble(Foo::getQuantityAsDouble));
但对我来说,这似乎是一个糟糕的解决方案

是否有任何方法可以直接将String.summingDouble()中的Foo::getQuantity强制转换为Double,而无需向原始bean添加膨胀函数


谢谢

Java不做从字符串到双精度的隐式转换,这就是您的代码所暗示的

您需要显式转换,这可以通过流中的转换来完成:

Map<String, Double> grouping = list.stream().collect(Collectors.groupingBy(Foo::getId,
            Collectors.summingDouble(foo -> Double.parseDouble(foo.getQuantity()))));
Map grouping=list.stream().collect(收集器.groupingBy(Foo::getId,
Collectors.summingDouble(foo->Double.parseDouble(foo.getQuantity());
(如果这些语义更合适,则使用Double.valueOf)

已编辑:清晰度

编辑更多内容:根据评论添加解释


双冒号语法(例如,
Foo::getQuantity
)创建方法引用。Double.valueOf只知道如何处理字符串。在这种情况下,java需要一些“命令式帮助”来连接点,因此需要命令式lambda,而不是函数引用。

A
String
不是
Double,因此不可能进行强制转换。使用
Double.valueOf`进行转换是一个很好的解决方案。您的私有方法实际上是一个很好的解决方案。它封装了默认值(以防字符串不代表数字)和转换。我尝试了一些语法,如:
Collectors.summingDouble(Double.valueOf(Foo::getQuantity))
,但没有成功。正确的是您所指的那一个:
Collectors.summingDouble(foo->Double.valueOf(foo.getQuantity())
。谢谢
Map<String, Double> grouping = list.stream().collect(Collectors.groupingBy(Foo::getId,
            Collectors.summingDouble(foo -> Double.parseDouble(foo.getQuantity()))));