RxJava2 / RxJava2操作符scan_rxjava2.x操作符-程序员宅基地

技术标签: RxJava  

scan操作符将Observable的结果在BiFunction扫描一遍后交给Observer使用,scan最大的功用是在BiFunction里面的apply里面做一次计算,有条件、有筛选的输出最终结果,例如代码例子:

package zhangphil.app;
 
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
 
import io.reactivex.Observable;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.CompositeDisposable;
import io.reactivex.functions.BiFunction;
import io.reactivex.observers.DisposableObserver;
import io.reactivex.schedulers.Schedulers;
 
public class MainActivity extends AppCompatActivity {
    private final String TAG = getClass().getSimpleName();
    private CompositeDisposable mCompositeDisposable = new CompositeDisposable();
 
    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
 
        test();
    }
 
    private void test() {
        DisposableObserver disposableObserver = new DisposableObserver<Integer>() {
            @Override
            public void onNext(Integer i) {
                Log.d(TAG, "#####开始#####");
                Log.d(TAG + "数据", String.valueOf(i));
                Log.d(TAG, "#####结束#####");
            }
 
            @Override
            public void onComplete() {
                Log.d(TAG, "onComplete");
            }
 
            @Override
            public void onError(Throwable e) {
                Log.e(TAG, e.toString(), e);
            }
        };
 
        mCompositeDisposable.add(
                getObservable().scan(new BiFunction<Integer, Integer, Integer>() {
                    @Override
                    public Integer apply(Integer a, Integer b) throws Exception {
                        Log.d(TAG, "scan:" + a + "," + b);
                        return b * b; //这个结果将作为最终输出结果到onNext里面
                    }
                })
                        .subscribeOn(Schedulers.io())
                        .observeOn(AndroidSchedulers.mainThread())
                        .subscribeWith(disposableObserver));
    }
 
    private Observable<Integer> getObservable() {
        return Observable.range(1, 5);
    }
 
    @Override
    protected void onDestroy() {
        super.onDestroy();
 
        // 如果退出程序,就清除后台任务
        mCompositeDisposable.clear();
    }
}

代码输出:

05-15 16:41:21.898 18230-30693/zhangphil.app D/MainActivity: scan:1,2
05-15 16:41:21.898 18230-30693/zhangphil.app D/MainActivity: scan:4,3
05-15 16:41:21.898 18230-30693/zhangphil.app D/MainActivity: scan:9,4
05-15 16:41:21.898 18230-30693/zhangphil.app D/MainActivity: scan:16,5
05-15 16:41:21.947 18230-18230/zhangphil.app D/InputTransport: Input channel constructed: fd=73
05-15 16:41:21.947 18230-18230/zhangphil.app D/ViewRootImpl@9990594[MainActivity]: setView = DecorView@a52a83d[MainActivity] touchMode=true
05-15 16:41:21.949 18230-18230/zhangphil.app D/MainActivity: #####开始#####
05-15 16:41:21.949 18230-18230/zhangphil.app D/MainActivity数据: 1
05-15 16:41:21.949 18230-18230/zhangphil.app D/MainActivity: #####结束#####
05-15 16:41:21.949 18230-18230/zhangphil.app D/MainActivity: #####开始#####
05-15 16:41:21.949 18230-18230/zhangphil.app D/MainActivity数据: 4
05-15 16:41:21.949 18230-18230/zhangphil.app D/MainActivity: #####结束#####
05-15 16:41:21.949 18230-18230/zhangphil.app D/MainActivity: #####开始#####
05-15 16:41:21.949 18230-18230/zhangphil.app D/MainActivity数据: 9
05-15 16:41:21.949 18230-18230/zhangphil.app D/MainActivity: #####结束#####
05-15 16:41:21.949 18230-18230/zhangphil.app D/MainActivity: #####开始#####
05-15 16:41:21.949 18230-18230/zhangphil.app D/MainActivity数据: 16
05-15 16:41:21.949 18230-18230/zhangphil.app D/MainActivity: #####结束#####
05-15 16:41:21.949 18230-18230/zhangphil.app D/MainActivity: #####开始#####
05-15 16:41:21.949 18230-18230/zhangphil.app D/MainActivity数据: 25
05-15 16:41:21.949 18230-18230/zhangphil.app D/MainActivity: #####结束#####
05-15 16:41:21.949 18230-18230/zhangphil.app D/MainActivity: onComplete


源输入:1,2,3,4,5
scan首先把源输入1,2,3,4,5数据成对成对的扫描一次,然后根据apply的约束函数输出一个结果形成一个最终输出结果给Observer。
注意:由于在第一次scan时候,源输入队列中的数据只有“1”,那么就只返回一个“1”。后面又成对的数据源,则成对的扫描。
 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/suyimin2010/article/details/92777566

智能推荐

哈工大计算机考研专业课大纲2020,2020年哈尔滨工业大学854计算机基础硕士研究生入学考试科目大纲...-程序员宅基地

文章浏览阅读481次。2020年全国硕士研究生入学考试命题标准大纲已于7月8日正式公布,接下来全国各研招院校将陆续发布2020考研专业课大纲。以下是小编整理的“2020年哈尔滨工业大学854计算机基础硕士研究生入学考试科目大纲”相关内容,以供各位考生参考。本考试科目考试时间180分钟,满分150分。包括计算机系统(计算机组成原理+操作系统)、计算机网络、数据结构与算法共三部分,每部分各70、40、40分。计算机系统部分..._哈尔滨工业大学 计算机基础专业课考什么

计算机技术的新发展和新应用,摘要:随着科学技术的日新月异以及互联网经济的快速发展,计算机信息技术已经被广泛应用在各行业中,有效促进了社会的长远发展【遵化高级中学信息技术主题社区吧】_百度贴吧...-程序员宅基地

文章浏览阅读457次。该楼层疑似违规已被系统折叠隐藏此楼查看此楼摘要:随着科学技术的日新月异以及互联网经济的快速发展,计算机信息技术已经被广泛应用在各行业中,有效促进了社会的长远发展。就目前而言,由于时代的发展以及社会的进步,传统的信息传递方式已经难以满足社会的需求,这在一定程度上推动了互联网信息技术的发展,进一步扩大了计算机信息技术的使用范围。本文就对互联网计算机信息技术的有效运用进行深入分析和探讨。关键词:互联网..._计算机新技术及其应用

接口幂等性_接口幂等时间-程序员宅基地

文章浏览阅读291次。发生原因交通卡开卡,充值接口,有个测试同学他突然发觉我们开卡,充值接口因为其实开卡成功,充值钱到交通卡芯片里面是在倒数第二次apud指令就完成了,然后他就就可以无限开卡,然后退款(他还没出钱),他可以明明充值成功,但是还是劫持指令,让最好一次收到结果是充值失败,他用这个交易序号连续充值,让每次都失败。解决办法将每次充值的交易序号保存下来,在每次进行充值时候都做合法性交易,这个交易我已经有了,你不能再使用了,直接报错,没有就保存到表里面。幂等性是指同一个操作,执行多次,后台的业务处理结果都是一样的。..._接口幂等时间

R 语言怎么保存工作目录到当前路径_C语言探索之旅 | 第二部分第七课:文件读写...-程序员宅基地

文章浏览阅读215次。内容简介前言文件的打开和关闭读写文件的不同方法在文件中移动文件的重命名和删除第二部分第八课预告1. 前言上一课 C语言探索之旅 | 第二部分第六课:创建你自己的变量类型 之后,我们来学习很常用的文件读写。我们学过了这么多变量的知识,已经知道变量实在是很强大的,可以帮助我们实现很多事情。变量固然强大,还是有缺陷的,最大的缺陷就是:不能永久保存。因为 C语言的变量储存在内存中,在你的程序退出..._怎么将txt文件保存在r工作环境所在的目录下

servlet-3_0-final-spec-程序员宅基地

文章浏览阅读118次。<?xml version="1.0" encoding="UTF-8"?><xsd:schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://java.sun.com/xml/ns/j2ee" xmlns:j2ee="http://java..._servlet-3_0 final-spec 中文版

lua函数之rawget和rawset_lua rewget-程序员宅基地

文章浏览阅读1.6k次。lua函数之rawget和rawset的应用_lua rewget

随便推点

docker-compose部署rabbitmq配置交换机和队列持久化_rabbitmq集群 docker-compose 持久化-程序员宅基地

文章浏览阅读985次。rabbitmq配置交换机和队列持久化_rabbitmq集群 docker-compose 持久化

Car-eye 开源平台基于JT/T 1078 视频协议打造功能强大的车联网管理平台_车联网 开源平台-程序员宅基地

文章浏览阅读554次。随着5G时代的来临,车辆管理平台开始慢慢把车载视频作为一个标准而制定。JT/T1078 是国家交通部制定的基于JT/T808 协议的视频补充协议。Car-eye 开源平台为此打造了功能强大的视频服务器和管理系统。整个系统的框架如下: 整个框架将设备,客户端,视频服务器,管理平台和数据库,政府监管平台几方有效的结合起来。其中使用成熟有效的socket框架和功能强大稳定的流媒体服..._车联网 开源平台

时间序列模型使用流程_时间序列模型-程序员宅基地

文章浏览阅读978次。时间序列模型使用流程AR, MA, ARMA, and ARIMA models are used to forecast the observation at (t+1) based on the historical data of previous time spots recorded for the same observation. However, it is necessary t..._有效值如何绘制

AngularJS Demo 项目_angularjs demo — 产品列表应用 该项目是 web 应用程序的应用程序框架。 您可以-程序员宅基地

文章浏览阅读2.8w次,点赞4次,收藏15次。本项目是一个基于AngularJS 1.x版本 构建的示例项目,旨在帮助初学者能够快速了解AngularJS各功能特性的使用方法,及综合运用它们开始一个CRUD项目。_angularjs demo — 产品列表应用 该项目是 web 应用程序的应用程序框架。 您可以

安装多版本Python,一个神器足矣_安装多个不同版本python 封装 pyd-程序员宅基地

文章浏览阅读554次。前言在Python开发中,有些情况下,我们可能面临在一台机器上同时安装多版本Python的需求。比如:有多个Python项目,每个项目依赖不同的Python版本。有一个Python项目,它需要同时支持多个Python版本。那么,如何高效地在单台机器上实现多个版本Python(具体来说,这里Python指的是Python解释器)的安装和维护呢?除此之外,我们还可能面临在一台机器上安装多..._安装多个不同版本python 封装 pyd

Java简单模拟Slf4j log4j 使用可变参数打印日志_slf4j如何打印可变参数-程序员宅基地

文章浏览阅读1k次。关键词:Slf4j、log4j、可变参数、源码、懒加载、正则想在打印日志后重复使用要输出的日志结果,所以想封装一下Slf4j可变参数打印的方法,同时拿到打印结果字符串;本来思路很简单,将可变参数依次填入占位符即可,但是想看看Slf4j是怎么实现的,中间遇到了些问题,记录一下。1、简单实现 暂时没有想到好方法通过输入的日志级别来动态调用log.info log.error等方法,所以写了三种不同级别的方法;FILL_STRING用来判断是否还有未填充的占位符;FILL_FORMAT用来.._slf4j如何打印可变参数

推荐文章

热门文章

相关标签