Как получить поведение «короткого замыкания» для логических операторов объединения в RxJava - PullRequest
0 голосов
/ 22 января 2020

Проблема, которую я пытаюсь решить, выглядит следующим образом:

У меня есть Flowable<E> items, List<Checker<E>> checkers с размером> = 1, где

interface Checker<E> {
  Single<Boolean> check(E element)
}

и некоторые doSomethingWith(E element) method.

То, что я хотел бы сделать, это (игнорировать asyn c и rx java на мгновение)

for(item in items) {
  var allChecksPass = true
  for(checker in checkers) {
    allChecksPass = checker.check(item)
    if (!allChecksPass) break // <--- prevent all further checks!
  }
  if (allChecksPass) doSomethingWith(item)
}

Вот моя попытка, которую я не думаю, правильный или лучший способ справиться с этим:

items.flatMapMaybe { item: E ->
  Flowable.fromIterable(checkers)
          .flatMapSingle { it.check(item) }
          .any { !it }
          .flatMapMaybe { notAllChecksPassed -> 
             if (notAllChecksPassed) Maybe.empty() else Maybe.just(item)
          }
}
.subscribe { doSomethingWith(it) }

Спецификация интерфейса Checker<E> находится в моем распоряжении, поэтому при необходимости мы можем изменить другую сигнатуру метода check. Однако идея заключается в том, что проверка должна быть асинхронной c.

...