В соответствии с документацией в реализации Java отсутствует withLatestFrom
(которая отличается от combineLatest
). Любая идея о том, как подражать этому? RxJava: как эмулировать withLatestFrom?
ответ
Учитывая a
как основные наблюдаемые и b
как «последнюю из» наблюдаемых, это псевдо-java8 лямбда должна делать то, что вы хотите:
a.publish(a' -> b.switchMap(y -> a'.map(x -> x + y)))
Это первое публикует a
в a'
, что позволяет ему быть подписанный повторно, без перезапуска потока. Затем каждый раз, когда выдается новый элемент из b
, он повторно подписывается на текущий поток a
, который объединяет в себе последний результат b
с каждым выходом a
.
Вы можете легко обернуть, что в качестве реализации RxJava-х Transformer
, как это (также полу-псевдо, так что проверить мой синтаксис):
public class WithLatestFrom<T, U, V> implements Transformer<T, V> {
private final Func2<T, U, V> function;
private final Observable<U> latest;
private WithLatestFrom<T, U, V>(final Observable<U> latest, Func2<T, U, V> function) {
this.function = function;
this.latest = latest;
}
public static <T, U, V> WithLatestFrom<T, U, V> with(
final Observable<U> latest, Func2<T, U, V> function) {
return new WithLatestFrom<T, U, V>(latest, function);
}
@Override
public Observable<V> call(final Observable<T> source) {
return source.publish((publishedSource) -> latest.switchMap((y) ->
publishedSource.map((x) -> function.call(x, y)));
}
}
Тогда вы можете повторно использовать его в коде, как:
a.compose(WithLatestFrom.with(b, (x, y) -> x + y));
Кроме того, я только выяснил, что 1.0.7 имеет экспериментальный оператор withLatestFrom: https://github.com/ReactiveX/RxJava/releases/tag/v1.0.7 :) – lopar
Yup, интересное решение в любом случае! Благодаря! –
Некоторые очень простая и наивная реализация:
@SuppressWarnings("unchecked")
public static <T, U, V> Observable<T> combineLatestFrom(
Observable<U> o1,
Observable<V> o2,
Func2<U, V, T> f) {
final Object nothing = new Object();
return Observable.create(s -> {
AtomicReference<V> val2 = new AtomicReference<V>((V) nothing);
o1.subscribe(v -> {
val2.getAndUpdate(current -> {
if (current != nothing) {
s.onNext(f.call(v, current));
}
return current;
});
}, s::onError, s::onCompleted);
o2.subscribe(val2::set, s::onError);
});
}
И этот метод может быть использован, как это:
combineLatestFrom(numbers, letters, (n, l) -> n + l)
.subscribe(System.out::println);
Если здесь цифры и буквы Наблюдаемых из мраморной диаграммы - > результат будет таким, как ожидалось.
Какова цель 'val1'? Ваш пример может быть упрощен, так как 'val1' кажется бесполезным? –
И вы абсолютно правы - обновляя его! – meddle
- 1. RxJava withLatestFrom не работает
- 2. буферный withLatestFrom
- 3. Как смоделировать Rx `withLatestFrom` с каналами core.async?
- 4. Вид withLatestFrom обе переменные источники скорости
- 5. Как использовать .doOnNext() с Action2 (RxJava)
- 6. Как эмулировать поведение AllowAnonymousAttribute?
- 7. Как эмулировать async Filestream
- 8. Как эмулировать Event.timeStamp
- 9. Как эмулировать onLowMemory()?
- 10. Как эмулировать remove_unless
- 11. Как эмулировать контейнеры visio?
- 12. Как эмулировать ISNOTNULL()
- 13. как эмулировать хороший рисунок
- 14. Как эмулировать среду IE8?
- 15. Как «эмулировать» логин администратора?
- 16. Как эмулировать потоковый API?
- 17. Как эмулировать GL_DEPTH_CLAMP_NV?
- 18. Как сделать IE9 эмулировать IE7?
- 19. Как эмулировать ластик на вид?
- 20. Как эмулировать RenderSection в Sitecore?
- 21. Как эмулировать адаптивность адаптера бутстрапа
- 22. Как эмулировать принтер в C#
- 23. Как эмулировать множественный экран Android?
- 24. Как эмулировать намерения через espresso
- 25. Как эмулировать замыкания в c
- 26. Как эмулировать триггерный флип-флоп?
- 27. Как эмулировать CUDA на окнах
- 28. Как эмулировать Task.Wait() в WinRT?
- 29. Как эмулировать консоль в WPF?
- 30. Как эмулировать процессоры в Java?
Возможно, дубликат http://stackoverflow.com/questions/27203435/combinelatest-emit-only-when-one-of-the-streams-changes –