Как использовать оператор RxJava combLatest с более чем 9 наблюдаемыми

Я использую RxJava, и я хочу объединить 12 различных наблюдаемых с помощью оператора combineLatest.

Я видел прототип функции, который принимает список наблюдаемых и реализацию FuncN, но я не уверен, как это сделать, у меня возникают проблемы с внедрением метода call.

Может ли кто-нибудь показать мне пример?

Ответ 1

Существует combineLatest, который принимает List наблюдаемых. Вот пример того, как его использовать:

List<Observable<?>> list = Arrays.asList(Observable.just(1), Observable.just("2"));
Observable.combineLatest(list, new FuncN<String>() {
    @Override
    public String call(Object... args) {
        String concat = "";
        for (Object value : args) {
            if (value instanceof Integer) {
                concat += (Integer) value;
            } else if (value instanceof String) {
                concat += (String) value;
            }
        }
        return concat;
    }
});

Ответ 2

Расширяйте этот ответ, я использую его для одновременного чтения нескольких характеристик, это можно сделать так:

connectionObservable
                .flatMap((Func1<RxBleConnection, Observable<?>>) rxBleConnection -> {
                    List<Observable<?>> list1 = Arrays.asList(
                            rxBleConnection.readCharacteristic(UUID...),
                            rxBleConnection.readCharacteristic(UUID...),
                            rxBleConnection.readCharacteristic(UUID...),
                            rxBleConnection.readCharacteristic(UUID...),
                            rxBleConnection.readCharacteristic(UUID...),
                            rxBleConnection.readCharacteristic(UUID...),
                            rxBleConnection.readCharacteristic(UUID...),
                            rxBleConnection.readCharacteristic(UUID...),
                            rxBleConnection.readCharacteristic(UUID...),
                            rxBleConnection.readCharacteristic(UUID...),
                            rxBleConnection.readCharacteristic(UUID...),
                            rxBleConnection.readCharacteristic(UUID...),
                            rxBleConnection.readCharacteristic(UUID...),
                            rxBleConnection.readCharacteristic(UUID...),
                            rxBleConnection.readCharacteristic(UUID...),
                            rxBleConnection.readCharacteristic(UUID...),
                            rxBleConnection.readCharacteristic(UUID...),
                            rxBleConnection.readCharacteristic(UUID...));
                    return Observable.combineLatest(list1, args -> {
                       Object o =  doSomethingWithResults(args);
                        return o;
                    });
                })
                .observeOn(AndroidSchedulers.mainThread())
                .doOnUnsubscribe(this::clearConnectionSubscription)
                .subscribe(retVal -> {
                    Log.d(TAG, "result:" + retVal.toString());
                    Log.w(TAG, "SUCCESS");
                    triggerDisconnect();

                }, MyActivity.this::onReadFailure);
    }

Комментарии, если у вас есть предложения по улучшению этого процесса.

Ответ 3

RxKotlin поддерживает до 9 операторов в параметрах в методе combLatest(), но использование более 9 параметров означает передачу неограниченного динамического массива пользовательских объектов, который вы можете использовать, как показано ниже:

Сначала позвольте мне привести простой пример с двумя параметрами с пользовательскими типами данных.

val name = Observable.just("MyName")
val age = Observable.just(25)
Observables.combineLatest(name, age) { n, a -> "$n - age:${a}" }
                .subscribe({
                    Log.d("combineLatest", "onNext - ${it}")
                })

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

val myList = arrayOf(Observable.just("MyName"),
                Observable.just(2),
                Observable.just(3.55),
                Observable.just("My Another String"),
                Observable.just(5),
                Observable.just(6),
                Observable.just(7),
                Observable.just(8),
                Observable.just(9),
                Observable.just(10),
                Observable.just(11),
                Observable.just(12),
                Observable.just(13),
                Observable.just(14),
                Observable.just(15))

Observable.combineLatest(myList, {
    val a = it[0] as String
    val b = it[1] as Int
    val c = it[2] as Float
    val d = it[3] as String
    val e = it[4] as Int
    val f = it[5] as Int
    val g = it[6] as Int
    val h = it[7] as Int
    val i = it[8] as Int
    val j = it[9] as Int
    val k = it[10] as Int
    val l = it[11] as Int
    val m = it[12] as Int
    "$a - age:${b}" })
        .subscribe({
            Log.d("combineLatest", "onNext - ${it}")
        })

Ответ 4

из кода выше. замените каждую строку

rxBleConnection.readCharacteristic(UUID...),

с

rxBleConnection.readCharacteristic(UUID...).onErrorResumeNext { bytes -> Observable.just(new byte[0])) },

По сути, вы возвращаете пустой массив байтов, если не найден какой-либо признак. код продолжит

Ответ 5

Я использую RxJava и хочу объединить 12 различных наблюдаемых с помощью оператора combLatest.

Я видел прототип функции, который принимает список наблюдаемых и реализацию. но я не уверен, как это сделать, у меня возникли проблемы с реализацией метода вызова. Пожалуйста, проверьте мой код и сделайте все необходимое.

Поток> получить города => _citiesController.stream;

Поток get city => _cityController.stream;

Поток get agentcity => _agentcityController.stream;

Поток get userpackages => _packagesController.stream;

Поток получить электронную почту => _emailController.stream.transform(validateEmail);

Поток get firstName => _firstNameController.stream.transform(validateFirstName);

Поток get lastName => _lastNameController.stream.transform(validateLastName);

Поток get mobileNumber => _mobileNumberController.stream.transform(validateMobile);

Поток get dob => _dobController.stream.transform(validatedob);

Поток get assigndate => _appointmentdateController.stream.transform(validateappointmentDate);

Поток get pincode => _pincodeController.stream.transform(validatePincode);

Поток получить пол => _genderController.stream;

Поток get address => _addressController.stream.transform(validateAddress);

Поток get agentname => _agentnameController.stream.transform(validateAgentName);

Поток get validSubmission => Observable.combineLatest9 (

email,
firstName,
mobileNumber,
pincode,
dob,
address,
agentname,
_genderController.stream,
_cityController.stream,
_agentcityController.stream,
_packagesController.stream,
_appointmentdateController.stream,
(e, f, m, p, d, a, an, g, c, ac, pc, ad) => true,

); Пожалуйста, дайте мне знать, как использовать объединить последние в моем коде с Flutter