簡體   English   中英

Java可選:映射到子類或其他超類

[英]Java optional: map to subclass or else super class

我正在嘗試用Manning的Manning的“ Akka in Action”重寫一個POC項目的scala示例。 該項目是用於創建事件和購買票證的小型Http服務器。

我正處於演員可以向我的RestApi發送Optional<Event> RestApi 根據是否存在該值,我應OK結束調用,否則應OK NOT_FOUND

在Scala中,代碼段如下所示:

      get {
          // GET /events/:event
          onSuccess(getEvent(event)) {
            _.fold(complete(NotFound))(e => complete(OK, e))
          }
        }

...其中getEvent返回一個Option[Event] (等效於Java的Optional<Event> )。 這就是我用Java重寫的方式:

   get(() -> onSuccess(() -> getEvent(event), eventGetRoute()))

   ...
    //and eventGetRoute() is a function:
    private Function<Optional<Event>, Route> eventGetRoute() {
        return maybeEvent -> maybeEvent.map(event -> complete(OK, event, Jackson.marshaller())).orElseGet(() -> complete(NOT_FOUND));
    }

無法編譯: Bad return type in lambda expression: Route cannot be converted to RouteAdapter 較長的(第一個) complete返回RouteAdapter ,第二個complete返回Route 如果我這樣重寫上面的函數:

private Function<Optional<Event>, Route> eventGetRoute() {
    return maybeEvent -> {
        if(maybeEvent.isPresent()) {
            return complete(OK, maybeEvent.get(), Jackson.marshaller());
        }
        return complete(NOT_FOUND);
    };
}

...然后編譯器不會抱怨,但是映射Optional並不是正確的方法。

Java沒有Optional的fold方法(至少在SE8中沒有),它允許先傳遞fallback-to值。

我很好奇是否可以尊重功能風格來編寫此功能。

更新

如評論中所問,這些是akka-http javadsl庫中complete方法的簽名:

  def complete(status: StatusCode): Route = RouteAdapter(
    D.complete(status.asScala))

  def complete[T](status: StatusCode, value: T, marshaller: Marshaller[T, RequestEntity]) = RouteAdapter {
    D.complete(ToResponseMarshallable(value)(fromToEntityMarshaller(status.asScala)(marshaller)))
  }

complete(OK, maybeEvent.get(), Jackson.marshaller())返回類型是什么?

我假設使用RouteAdapter 如果這樣將其RouteAdaperRoute ,則鏈將綁定到Route而不是RouteAdaper並且最后在將RouteAdaper類轉換為子類時不會遇到麻煩。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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