使用Java Optional.map从布尔值

时间:2019-02-18 10:25:33

标签: java java-8 optional

我想使用类似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));
}

但是我在<<<<1>>>>上遇到此编译错误:

  

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

2 个答案:

答案 0 :(得分:1)

您还可以避免使用boolean可选,这将简化方法:

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

答案 1 :(得分:1)

您的方法链将不起作用,因为您创建了Optional<Boolean>,并且无法映射到从String派生的field上。您需要拥有Optional<String>
这就是我带来的

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