[英]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
。 如果這樣將其RouteAdaper
為Route
,則鏈將綁定到Route
而不是RouteAdaper
並且最后在將RouteAdaper
類轉換為子類時不會遇到麻煩。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.