Rxjava无初值扫描函数
Rxjava scan function without initial value
我想要这样的扫描功能:
fun Observable<T>.scan(initialValueProvider: (T) -> R, accumulator: (R, T) -> R)
基本上它对第一个发出的值使用 initialValueProvider,对后面的值使用累加器。
这个扫描函数与 scanWith 函数非常相似,不同的是我想用 initialValueProvider 从第一个发出的项目中产生第一个值。
我需要为它编写自定义运算符吗?或者我们已经有了某种组合来获得那个功能?
您确实必须使用状态转换或编写自定义运算符。例如:
Observable.defer(() -> {
AtomicReference<R> current = new AtomicReference<>();
return source.map(v -> {
R acc = current.get();
if (acc == null) {
acc = Objects.requireNonNull(initialValueProvider.apply(v));
current.set(acc);
} else {
acc = Objects.requireNonNull(accumulator.apply(acc, v));
current.set(acc);
}
return acc;
});
});
我想要这样的扫描功能:
fun Observable<T>.scan(initialValueProvider: (T) -> R, accumulator: (R, T) -> R)
基本上它对第一个发出的值使用 initialValueProvider,对后面的值使用累加器。
这个扫描函数与 scanWith 函数非常相似,不同的是我想用 initialValueProvider 从第一个发出的项目中产生第一个值。
我需要为它编写自定义运算符吗?或者我们已经有了某种组合来获得那个功能?
您确实必须使用状态转换或编写自定义运算符。例如:
Observable.defer(() -> {
AtomicReference<R> current = new AtomicReference<>();
return source.map(v -> {
R acc = current.get();
if (acc == null) {
acc = Objects.requireNonNull(initialValueProvider.apply(v));
current.set(acc);
} else {
acc = Objects.requireNonNull(accumulator.apply(acc, v));
current.set(acc);
}
return acc;
});
});