簡體   English   中英

Java可選的返回值(如果存在)

[英]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.Eitherio.vavr.control.Validation單子。 看一下validate的可能簽名:

Either<SpecificError, ? extends Message> validate(Message message);

現在可以像這樣使用mapfold組合器:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM