【问题标题】:Compiler error while using Java Optional.map to string from boolean使用 Java Optional.map 从布尔值转换字符串时出现编译器错误
【发布时间】:2019-02-18 10:25:33
【问题描述】:

我想用类似Optional 的代码重写这段代码:

private Order buildOrder(String field) {
    if (field.startsWith("-")) {
        return Order.desc(field.substring(1));
    }
    else {
        return Order.asc(field);
    }
}

到目前为止,我已经能够编写代码:

private Order buildOrder(String field) {
    return Optional.of(field.startsWith("-"))
      .filter(Boolean::booleanValue)
      .map(() -> field.substring(1))  <<<<1>>>>
      .orElse(field)
      .map(Order.desc(field.substring(1)))
      .orElse(Order.asc(field));
}

但我在&lt;&lt;&lt;&lt;1&gt;&gt;&gt;&gt; 上收到此编译错误:

Lambda 表达式的签名与函数式接口方​​法apply(? super Boolean) 的签名不匹配 类型不匹配:无法从 String 转换为 ? extends U

【问题讨论】:

  • map(f -&gt; f.substring(1))替换map(() -&gt; field.substring(1))
  • map 期望传入 Function,而您正在传递与 Supplier 功能接口匹配的 lambda 表达式。
  • 顺便说一句,尽管我通常喜欢函数式编程范例,但我发现您的原始代码更加优雅。
  • 该错误是因为Optional.map 方法将Function 作为参数。来自Function的定义:表示接受一个参数并产生结果的函数。您的代码缺少参数。
  • 将其更改为 Optional 不会使其更具可读性。为什么要这样做?

标签: java java-8 optional


【解决方案1】:

你也可以避免布尔可选,这将简化方法:

return Optional.of(field)
        .filter(f -> f.startsWith("-"))
        .map(s -> s.substring(1))
        .map(Order::desc)
        .orElseGet(() -> Order.asc(field));

【讨论】:

  • 但是说真的,你真的会推荐使用它而不是,例如return field.startsWith("-")? Order.desc(field.substring(1)): Order.asc(field);?
  • @Holger 那以及问题中的第一个实现在很多方面都更好。我想我/我们被困在回答“如何使用......”这样的问题中。感谢您的评论,我认为我们大多数人都必须尝试让我们的头脑更加远离盒子,并且(至少)在答案中包括这样的 cmets。
【解决方案2】:

您的方法链将不起作用,因为您创建了一个 Optional&lt;Boolean&gt; 并且无法映射到从 field 派生的 String。你需要有Optional&lt;String&gt;
这是我带来的

private Order buildOrder(String field) {
    return Optional.of(field)
                .filter(f -> field.startsWith("-"))
                .map(f -> Order.desc(field.substring(1))
                .orElse(Order.asc(field));
}

【讨论】:

  • f-&gt;field.startWith - 那么您实际上并没有在Optional 中使用f,您也可以使用原来的Optional&lt;Boolean&gt;
  • ……和this comment 也适用于此。
猜你喜欢
  • 1970-01-01
  • 2013-02-02
  • 2019-09-02
  • 2015-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-23
  • 1970-01-01
相关资源
最近更新 更多