Как создать функции, которые будут прослушивать изменения в hashmap? - PullRequest
1 голос
/ 21 января 2020
private HashMap<Integer, Item> items = new Hashmap<>();

private Flowable<Item> observeItemById(int id) {
  return Flowable.create(emitter -> {
    ???
  },BackpressureStrategy.LATEST);
}

private Flowable<List<Item>> observeItems() {
  return Flowable.create(emitter -> {
    ???
  },BackpressureStrategy.LATEST);
}

//For now I update my hashmap just by putting new items or updating their fields in Item object

Каждый раз, когда я вызываю эти функции, я хотел бы создать «новый экземпляр» этих функций / «новый слушатель». Когда я вызываю applyItems (), я хотел бы создать список, когда в этом списке будут какие-либо изменения. Но когда я вызываю НаблюдениеItemById (int id), оно должно быть выдано, когда будет изменение в этом объекте Item.

Как мне создать эти функции?

Как мне создать мою хэш-карту и позже обновить его, чтобы выдать эти изменения?

Ответы [ 2 ]

0 голосов
/ 21 января 2020

Например:

class Item

class ObservableHashMap(private val map: MutableMap<Int, Item> = mutableMapOf()) : MutableMap<Int, Item> by map {

    private val changesSubject = PublishSubject.create<Pair<Int, Item>>()

    override fun put(key: Int, value: Item): Item? {
        return map.put(key, value).also {
            changesSubject.onNext(Pair(key, value))
        }
    }

    override fun remove(key: Int): Item? {
        return map.remove(key)?.also { value ->
            changesSubject.onNext(Pair(key, value))
        }
    }

    fun observeItemById(id: Int): Flowable<Item> {
        return changesSubject.toFlowable(BackpressureStrategy.LATEST)
                .filter { (key) -> key == id }.map { (_, value) -> value }
    }

    fun observeItems(): Flowable<List<Item>> {
        return changesSubject.toFlowable(BackpressureStrategy.LATEST)
                .map { values.toList() }
    }
}
0 голосов
/ 21 января 2020

вы можете создать оболочку, которая возвращает Flowable. Затем вы должны переопределить функцию put и выполнить изменение с помощью Flowable.

...