kotlin - 没有初始值的rxjava扫描函数
问题描述
我想要这样的扫描功能:
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;
});
});
推荐阅读
- python - 如何从网络摄像头 OpenCV 裁剪圆形图像并删除背景
- powershell - 从表格模型中提取 DMV 结果的 Powershell 脚本
- javascript - 如何在反应模糊时按排序顺序显示密码?
- swift - 计算结构数组中相同值的数量
- azure-active-directory - 将自定义 Azure AD 角色分配给安全组
- ubuntu - 新远程节点上的 Rundeck 身份验证失败
- c++ - 使用放置 new 构造的 C++ volatile 对象
- ios - 在某些 iPhone 设备上,Share Pass 未显示为选项
- python - 数据框中的条件操作(如果有)
- python - freeze_time `ignore` 似乎不适用于更复杂的设置(Django + S3 / boto)