На самом деле, это может быть достигнуто довольно просто, если вы распространяете ошибку в нисходящем направлении, если идентификатор не найден, и подписываетесь, где бы вы ни хотели воздействовать на эту ошибку. Также довольно легко включить информацию об отсутствующих столбцах, например, так:
public Single<List<Bar>> doSomething(Collection<String> ids) {
return getAllBars()
.map(bars -> {
List<Bar> unknownBars = new ArrayList<>();
for(Bar bar : bars) {
if(!ids.contains(bar.getId()) {
unknownBars.add(bar);
}
}
if (unknownBars.isEmpty()) {
return bars;
} else {
throw new BarsNotFoundException(unknownBars);
}
});
}
//elsewhere
doSomething(ids)
.subscribe(bars -> { /* do something */ }, throwable -> { /* handle error */ });
Если оператор throw достигнут на вашей карте, вторая лямбда вашего метода подписки будет выполнена с ошибкой, которую выЯ бросил.
То, что я узнал, используя сам rx: Когда вы начинаете чувствовать себя более комфортно с ним, он начинает ощущаться как новый модный молоток, и вдруг все выглядит как гвоздь. Не забывайте использовать его только тогда, когда оно облегчает вашу жизнь, а не усложняет ее.