[英]Java Optional return value only if present
是否可以僅從方法中返回Optional值(如果存在),而不僅僅是繼續常規方法流程。 像這樣:
public Message processMessage(Message message) {
// ErrorMessage is subclass of Message; only returned if validator found some violations, otherwise empty optional
Optional<ErrorMessage> error = validator.validate(message);
if (error.isPresent()) return error.get();
// returns different possible subclasses of Message
return service.processMessage(message);
}
有沒有更漂亮的方式寫這個?
您的問題確實是返回類型不匹配。 orElseGet
僅在供應商返回Optional
類型的子類型時有效。
要解決此問題,您可以先強制轉換為父類型:
return error.<Message>map(m -> m).orElseGet(() -> service.processMessage(message));
或等效地:
return error.map(m -> (Message) m).orElseGet(() -> service.processMessage(message));
我只是選擇使用Optional.orElseGet
和之間的顯式轉換:
public Message processMessage(final Message message) {
return validator.validate(message)
.map(Message.class::cast)
.orElseGet(() -> service.processMessage(message));
}
我目前無法測試,但可能會給您一個想法,也許您可以實現以下內容
return Optional.ofNullable(message)
.map(validator::validate)
.orElseGet(service::processMessage)
查看該代碼段,看起來好像validate
validator
上的validate
方法沒有正確的返回類型。 考慮使用如io.vavr.control.Either
或io.vavr.control.Validation
單子。 看一下validate
的可能簽名:
Either<SpecificError, ? extends Message> validate(Message message);
現在可以像這樣使用map
和fold
組合器:
validator
.validate(message)
.map(message -> service.processMessage(message))
.fold(error -> new ErrorMessage(error), success -> success); // the left function can be replaced by Function.identity()
產生Message
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.