Как избежать вложенных подписок при работе со смешанными Maybe и Single - PullRequest
0 голосов
/ 28 января 2019

Я выполнил следующее требование:

У меня есть метод, который возвращает Maybe, и мне нужно обработать его в отъезде, чтобы, если он возвращает что-то, вызвать другой метод, который возвращает Singleв противном случае OnComplete вызывает Single.

Вот фрагмент:

 doSomethingThatReturnsMaybe()
 .flatMapSingleElement(obj-> {
     return doSomethingThatReturnsSingle();
 })
 .subscribe(obj -> LOG.info(obj),
  err -> LOG.err("", err),
  () -> {
     doSomethingThatReturnsSingle()
     .subscribe();
  });

Есть идеи, как избавиться от вложенного subscribe?

ОБНОВЛЕНИЕ: Последний фрагмент кода

doSomethingThatReturnsMaybe()
  .flatMapSingleElement(obj-> {
    return doSomethingThatReturnsSingle();
  })
  .switchIfEmpty(doSomethingElseThatReturnsSingle())
  .subscribe(obj -> LOG.info(obj),
         err -> LOG.err("", err);

Ответы [ 2 ]

0 голосов
/ 31 января 2019

Если я правильно понимаю, то в обоих случаях (независимо от того, пусто или нет) вы хотите позвонить на doSomethingThatReturnsSingle().Если это так, приведенный ниже код может помочь,

doSomethingThatReturnsMaybe().isEmpty()
                             .flatMap(isEmpty-> doSomethingThatReturnsSingle())
                             .subscribe(obj-> System.out.println(obj));
0 голосов
/ 28 января 2019

После обсуждения комментариев я чувствую, что это может быть решением.

Я бы использовал switchIfEmpty здесь.

Что-то вроде:

doSomethingThatReturnsMaybe()
  .flatMapSingleElement(obj-> {
    return doSomethingThatReturnsSingle();
  })
  .switchIfEmpty(doSomethingThatReturnsSingle())
  .subscribe(obj -> LOG.info(obj),
             err -> LOG.err("", err);

switchIfEmpty будет выполнено, если Maybe вернется пустым.Обратите внимание, это отличается от того, что у вас было.То, что у тебя было, выполняется doSomethingThatReturnsSingle() дважды.Этот новый пример выполняет его один раз.Если возможно возвращает пустое значение, switchIfEmpty запустит его один раз, в противном случае он будет запущен на flatMapSingleElement.До того, как он запустился, как только поток завершился.

...