Java 可选:映射到 subclass 或 super class
Java optional: map to subclass or else super class
我正在尝试在 Java 中重写来自 Manning 的 "Akka in Action" 的 POC 项目的 scala 示例。该项目是一个用于创建活动和购买门票的小型 Http 服务器。
我正处于演员可以向我的 RestApi
发送 Optional<Event>
的时刻。根据该值是否存在,我应该使用 OK
完成调用,否则 NOT_FOUND
.
在 Scala 中,代码片段如下所示:
get {
// GET /events/:event
onSuccess(getEvent(event)) {
_.fold(complete(NotFound))(e => complete(OK, e))
}
}
...其中 getEvent
returns 一个 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
returns a RouteAdapter
和第二个 returns a 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 中没有),它允许首先传递后备值。
我很好奇是否可以按照函数式风格编写此函数。
更新:
如评论中所述,这些是 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())
的 return 类型是什么?
我假设 RouteAdapter
。如果这样将其转换为 Route
那么链将绑定到 Route
而不是 RouteAdaper
并且最后从 super class 转换为 sub[=19= 不会有问题].
我正在尝试在 Java 中重写来自 Manning 的 "Akka in Action" 的 POC 项目的 scala 示例。该项目是一个用于创建活动和购买门票的小型 Http 服务器。
我正处于演员可以向我的 RestApi
发送 Optional<Event>
的时刻。根据该值是否存在,我应该使用 OK
完成调用,否则 NOT_FOUND
.
在 Scala 中,代码片段如下所示:
get {
// GET /events/:event
onSuccess(getEvent(event)) {
_.fold(complete(NotFound))(e => complete(OK, e))
}
}
...其中 getEvent
returns 一个 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
returns a RouteAdapter
和第二个 returns a 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 中没有),它允许首先传递后备值。
我很好奇是否可以按照函数式风格编写此函数。
更新:
如评论中所述,这些是 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())
的 return 类型是什么?
我假设 RouteAdapter
。如果这样将其转换为 Route
那么链将绑定到 Route
而不是 RouteAdaper
并且最后从 super class 转换为 sub[=19= 不会有问题].