【问题标题】:Type cast inside lambda expression in Java?在Java中的lambda表达式中进行类型转换?
【发布时间】: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 String is not a Double, so casting is not possible. Using Double.valueOf` 做转换是个好办法。
  • 你的私有方法其实是一个很好的解决方案。它封装了默认值(以防字符串不代表数字)和转换。

标签: java lambda casting


【解决方案1】:

Java 不执行从 String 到 Double 的隐式转换,这是您的代码所暗示的。

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

Map<String, Double> grouping = list.stream().collect(Collectors.groupingBy(Foo::getId,
            Collectors.summingDouble(foo -> Double.parseDouble(foo.getQuantity()))));

(如果这些语义更合适,则使用 Double.valueOf)

已编辑:清晰

EDITED MORE:根据评论添加解释。

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

【讨论】:

  • 我尝试了一些语法,例如:Collectors.summingDouble(Double.valueOf(Foo::getQuantity)),但没有奏效。正确的是你指出的那个:Collectors.summingDouble(foo -&gt; Double.valueOf(foo.getQuantity()))。谢谢!
猜你喜欢
  • 1970-01-01
  • 2015-06-07
  • 1970-01-01
  • 2018-10-09
  • 1970-01-01
  • 2017-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多