我正试图从Manning在爪哇的“AkkAin行动”中重写一个PoC项目的Scala例子。这个项目是一个小的HTTP服务器,用于创建事件和购买票据。
我正处在一个演员可以
Optional
对我
RestApi
. 根据值是否存在,我应该用
OK
其他
NOT_FOUND
.
在scala中,代码片段如下:
get {
// GET /events/:event
onSuccess(getEvent(event)) {
_.fold(complete(NotFound))(e => complete(OK, e))
}
}
…在哪里
getEvent
返回一个
Option[Event]
(相当于Java的
可选事件
)这就是我在Java中改写的方法:
get(() -> onSuccess(() -> getEvent(event), eventGetRoute()))
...
//and eventGetRoute() is a function:
private Function, 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
返回A
RouteAdapter
第二个返回
Route
. 如果我这样重新编写上述函数:
private Function, Route> eventGetRoute() {
return maybeEvent -> {
if(maybeEvent.isPresent()) {
return complete(OK, maybeEvent.get(), Jackson.marshaller());
}
return complete(NOT_FOUND);
};
}
…那么编译器就不会抱怨了,但是它不是映射可选的正确方法。
Java没有
fold
方法用于可选(至少不在SE8中),它允许首先将回退传递给值。
我很好奇是否可以在尊重功能风格的基础上编写这个函数。
更新
:
正如评论中所要求的,这些是
完成
方法从
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)))
}