У меня есть код, который вызывает cockbase для получения некоторых строк следующим образом:
val gotValues: Observable[JsonDocument] = Observable.from(rowKeys).flatMap(id =>
couchbaseBucket.async().get(id))
Если у меня есть 1,2,3,4,5,6 в качестве входных ключей строк, а в БД существуют только строки 1,2,3, тогда наблюдаемые будут получать уведомления только о 1,2,3.
Однако мое требование состоит в том, чтобы я возвращал карту с 1,2,3 истинными (существуют в БД) и 4,5,6 с ложными (что означает отсутствие в БД). Мне удалось сделать это с помощью scala observable, однако я использую структуру данных промежуточной карты, чтобы вернуть общую карту, содержащую все идентификаторы. Ниже приведен пример кода, который имитирует мою проблему.
object Main extends App {
import rx.lang.scala.Observable
val idsToFetch = Seq(1,2,3,4,5,6)
println(isInDBOrNot()) // {1=true, 2=true, 3=true, 4=false, 5=false, 6=false}
private def isInDBOrNot(): ConcurrentHashMap[Int, Boolean] = {
val inAndNotInDB = new java.util.concurrent.ConcurrentHashMap[Int, Boolean]
// - How can I avoid the additional data structure?
// - In this case a map, so that the function will return
// a map with all numbers and for each if exist in DB?
// - I mean I want the function to return a map I don't
// want to populate that map inside the observer,
// it's like a mini side effect I would rather simply
// manipulate the stream.
Observable.from(idsToFetch)
.filterNot(x => x == 4 || x == 5 || x == 6) // Simulate fetch from DB, 4,5,6 do not exist in DB, so not returned.
.subscribe(
x => inAndNotInDB.put(x, true),
e => println(e),
() => idsToFetch.filterNot(inAndNotInDB.containsKey)
.foreach(inAndNotInDB.put(_, false)) // mark all non-found as false.
)
inAndNotInDB
}
}
В любом случае, чтобы сделать это без промежуточной карты (без заполнения промежуточной структуры данных, а только путем манипулирования потоком)? Он не выглядит чистым!! . Спасибо.