Использование Rx Java для наблюдения за действиями «добавить» и «удалить» - PullRequest
1 голос
/ 17 января 2020

Я хотел бы знать, возможно ли использовать Rx Java для получения обновлений в списке (точнее, в ArrayList). Я хочу, чтобы n подписчиков получали обновления, когда в список добавлен или удален элемент. Мне нужно знать, что это было за действие, а не только за элемент, который был изменен.

Я пытался найти это, но на данный момент самое близкое, что я нашел, это ответ

Однако это касается только функции «добавить», а не «удалить» ...

Было бы неплохо иметь функцию onAdd(Item item), вызываемую при добавлении элемента в список, а затем еще один onRemove(Item item), когда он будет удален.

Если это неправильный способ использования Rx Java, скажите, пожалуйста, я учусь и принимаю любую помощь / критику :)

Спасибо, Iscle

1 Ответ

1 голос
/ 17 января 2020

Есть несколько способов сделать это. Одним из способов является добавление второй наблюдаемой, которая должна быть довольно простой. Второй вариант - пропускать операцию каждый раз при получении уведомления.

Например (использование lombok для генерации конструкторов, получателей и т. Д. c):

public class ObservableListExample {

    @NoArgsConstructor
    public static class ObservableList<T> {

        protected final List<T> list = new ArrayList<T>();
        protected final PublishSubject<Notification<T>> onChange = PublishSubject.create();

        public void add(T value) {
            list.add(value);
            onChange.onNext(new Notification<T>(Operation.ADD, value));
        }

        public void remove(T value) {
            list.remove(value);
            onChange.onNext(new Notification<T>(Operation.REMOVE, value));
        }

        public Observable<Notification<T>> getObservable() {
            return onChange;
        }
    }

    public static void main(String[] args) throws Exception {
        ObservableList<Integer> olist = new ObservableList<>();

        olist.getObservable().subscribe(n -> System.out.println("op: " + n.getOperation() + " i: " + n.getItem()));

        olist.add(1);
        Thread.sleep(1000);
        olist.add(2);
        Thread.sleep(1000);
        olist.add(3);
        Thread.sleep(1000);
        olist.remove(2);
    }

    public static enum Operation {
        ADD,
        REMOVE
    }

    @Getter
    @AllArgsConstructor
    public static class Notification<T> {
        private Operation operation;
        private T Item;
    }
}

Вывод:

op: ADD i: 1
op: ADD i: 2
op: ADD i: 3
op: REMOVE i: 2
...