Java 可选 : map to subclass or else super class

标签 java scala akka option-type akka-http

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

我现在正处于一个 Actor 可以发送 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);
    };
}

...那么编译器不会提示,但这不是映射可选的正确方法。

Java 没有 fold Optional 的方法(至少在 SE8 中没有),它允许首先传递后备值。

我很好奇是否可以按照函数式风格编写这个函数。

更新:

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

  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。如果这样将其转换为 Route,那么链将绑定(bind)到 Route 而不是 RouteAdaper,并且最终不会遇到从父类(super class)转换为子类。

关于Java 可选 : map to subclass or else super class,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54837855/

相关文章:

java - Apache 或其他一些 CLIENT JAVA 实现是否支持 HTTP/2?

scala - VSCode 金属,在 Scalatest 中运行特定十

scala - Scala 中间件选择之间有何区别?

在平面映射 AnyRef* 后,Scala 无法解析正确的重载 SLF4J 方法

playframework - 返回 Akka.Future - Play 框架

scala - Akka : the proper use of `ask` pattern?

Java多线程文件下载性能

java - GCC 错误消息格式

java - 如何更改不是我在 RecycleView 中单击的项目?

arrays - 如何在 scala 中解析 json 列表或数组以用于 play 框架 2.2