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;
    });
});