【发布时间】:2018-02-15 00:28:44
【问题描述】:
我在 Java 8 下使用 Spring Boot,并尝试在 lambda 表达式中执行类型转换,但经过大量研究和尝试/错误后无法使其工作。
假设我有一个这样的列表:
List<Foo> list;
在批处理的一个步骤中填充,并且由于数据源的限制,类Foo需要这样声明(其所有成员都为String):
class Foo {
private String id;
private String quantity;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getQuantity {
return quantity;
}
public void setQuantity(String quantity) {
this.quantity = quantity;
}
}
加载列表后,鉴于数量 String 表示十进制数,我需要根据 id 进行一些分组和求和。
以下代码给了我一个错误,因为 summingDouble 期望的是 Double,而不是 String:
Map<String, Double> grouping = list.stream().collect(Collectors.groupingBy(Foo::getId, Collectors.summingDouble(Foo::getQuantity)));
我通过向 Foo 类添加一个额外的函数来修复错误,如下所示:
public Double getQuantityAsDouble() {
return StringUtils.isEmpty(quantity) ? new Double(0) : Double.valueOf(quantity);
}
并以这种方式进行调用:
Map<String, Double> grouping = list.stream().collect(Collectors.groupingBy(Foo::getId, Collectors.summingDouble(Foo::getQuantityAsDouble)));
但这对我来说似乎是一个糟糕的解决方案。
有没有什么方法可以直接将 Foo::getQuantity 从 String 转换为 Collectors.summingDouble() 内的 Double 而无需向原始 bean 添加膨胀函数?
谢谢!
【问题讨论】:
-
A
Stringis not aDouble, so casting is not possible. UsingDouble.valueOf` 做转换是个好办法。 -
你的私有方法其实是一个很好的解决方案。它封装了默认值(以防字符串不代表数字)和转换。