Необязательный Java: отображение на подкласс или суперкласс - PullRequest
0 голосов
/ 23 февраля 2019

Я пытаюсь переписать пример 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)))
  }

1 Ответ

0 голосов
/ 23 февраля 2019

Что такое тип возврата complete(OK, maybeEvent.get(), Jackson.marshaller())?

Я предполагаю RouteAdapter.Если это так, приведите его к Route, чтобы цепочка была привязана к Route, а не RouteAdaper, и в конце не будет проблем с приведением класса из суперкласса к подклассу.

...