【发布时间】: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));
}
但我在<<<<1>>>> 上收到此编译错误:
Lambda 表达式的签名与函数式接口方法
apply(? super Boolean)的签名不匹配 类型不匹配:无法从String转换为? extends U
【问题讨论】:
-
用
map(f -> f.substring(1))替换map(() -> field.substring(1)) -
map期望传入Function,而您正在传递与Supplier功能接口匹配的 lambda 表达式。 -
顺便说一句,尽管我通常喜欢函数式编程范例,但我发现您的原始代码更加优雅。
-
该错误是因为
Optional.map方法将Function 作为参数。来自Function的定义:表示接受一个参数并产生结果的函数。您的代码缺少参数。 -
将其更改为
Optional不会使其更具可读性。为什么要这样做?