Java可选:映射到子类或超类

问题描述 投票:0回答:1

我试图用Manning的Java中的“Akka in Action”重新编写一个POC项目的scala示例。该项目是一个小型Http服务器,用于创建活动和购买门票。

我正处于一个演员可以向我的Optional<Event>发送RestApi的时刻。根据值是否存在,我应该使用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,第二个返回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没有可选的fold方法(至少在SE8中没有),它允许首先传递fallback-to值。

我很好奇是否有可能在功能风格方面编写这个功能。

更新:

正如评论中所述,这些是来自complete javadsl库的akka-http方法的签名:

  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)))
  }
java scala akka optional akka-http
1个回答
5
投票

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

我假设RouteAdapter。如果这样把它投到Route所以链将被绑定到Route而不是RouteAdaper,并且最终不会有从超级类转换为子类的麻烦。

© www.soinside.com 2019 - 2024. All rights reserved.