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