Проблема, которую я пытаюсь решить, выглядит следующим образом:
У меня есть 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.