Различают if zip один Single с другим, основываясь на выражении if - PullRequest
0 голосов
/ 29 августа 2018

Я подписываюсь на два сингла на молнии:

 firstRepository.sync(id)
      .zipWith(secondRepository.sync(id))

Теперь я хочу различить, какие из репозиториев я хочу синхронизировать на основе логического значения. Поэтому я могу выполнить синхронизацию только в одном репозитории или, если они оба «включены», выполнить для них этот оператор zipWith.

Как мне сделать это чистым способом?

1 Ответ

0 голосов
/ 30 августа 2018

вы могли бы:

  1. map эмиссия из каждого хранилища в другой тип оболочки, который включает этот логический флаг
  2. в функции zip оценивает логические флаги, чтобы определить, какую эмиссию значения репозитория использовать

примерно так:

class Repository {
  Single<Integer> sync(String id) {
    return Single.just(Integer.valueOf(id));
  }
}

class State {
  final int value;
  final boolean active;

  State(int value, boolean active) {
    this.value = value;
    this.active = active;
  }
}

final Repository firstRepository = new Repository();
final Repository secondRepository = new Repository();

final Single<State> firstEmission =
    firstRepository
        .sync(...)
        .map(value -> new State(value, true)); // <-- boolean for firstRepository

final Single<State> secondEmission =
    secondRepository
        .sync(...)
        .map(value -> new State(value, false)); // <-- boolean for secondRepository

firstEmission.zipWith(secondEmission, (first, second) -> {
  if(first.active && !second.active) {
    // firstRepository is active so use its emission...
    return first.value;

  } else if(!first.active && second.active) {
    // secondRepository is active so use its emission...
    return second.value;

  } else if(first.active && second.active) {
    // both repositories are active, so apply some special logic...
    return first.value + second.value;

  } else {
    throw new RuntimeException("No active repository!");
  }
})
    .subscribe();
...