Я пытаюсь переписать пример scala проекта POC из книги Мэннинга "Akka in Action" на Java.Проект представляет собой небольшой 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]
(эквивалент Optional<Event>
Java).Вот как я переписал это на 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)))
}