Operators(操作符):其实质是函数式编程中的高阶函数,是对响应式编程的各个过程拆分和封装后的产物,以便于我们操作数据流 。

在RxJava 2.x版本中,rxjava种类划分:

创建操作符:Observable.create(), Observable.just(), Observable.fromXXX(), Observable.defer();

转换操作符:Observable.map(), Observable.flatMap(), Observable.buffer(), Observable.concatMap();

过滤操作符:Observable.filter(), Observable.sample(), Observble.take();

组合操作符:Observable.join(), Observable.merge(), Observable.combineLatest();

条件运算符:Observable.amb(), Observable.contains(), Observable.skipUtil();

功能性操作符:Observable.subscribeOn(), Observable.observeOn(), Observable.delay();

错误处理操作符:Observable.onErrorResumeNext(), Observable.retry();

数学运算及聚合操作符:Observable.count(), Observable.reduce(), Observable.concat();

其他:Observable.toList(), Observable.publish().

代码实现:
<创建操作符>
    @Test
    public void testOperatorCreates() {
    
        Observable.create(Emitter ->{
            Emitter.onNext(123);
        }).subscribe(value -> System.out.println("<create> emitter value is: " + value));
        
        System.out.println();
        Observable.just(1,2,3,4,5)
        .subscribe(value -> System.out.println("<just> emitter value is: " + value));
        
        Observable.just("First message, Hello RxJava","This is the second message")
        .subscribe(value -> System.out.println("<just> emitter value is: " + value));
        
        System.out.println();
        Observable.fromCallable(() ->{
            return Observable.just(10,20,30,40,50);
        })
        .subscribe(emitter -> System.out.println("<fromCallable> emitter value is: " + emitter));
        
        System.out.println();
        Observable.defer(() ->{
            return Observable.just(11,12,13,14,15);
        }).subscribe(emitter -> System.out.println("<defer> emitter value is: " + emitter));
        
        System.out.println();
        Integer[] array = {21,22,23,24,25};
        Observable.fromArray(array).subscribe(emitter -> System.out.println("<fromArray> emitter value is: " + emitter));
    }

执行结果:
    <create> emitter value is: 123

<just> emitter value is: 1
    <just> emitter value is: 2
    <just> emitter value is: 3
    <just> emitter value is: 4
    <just> emitter value is: 5
    <just> emitter value is: First message, Hello RxJava
    <just> emitter value is: This is the second message

<fromCallable> emitter value is: io.reactivex.internal.operators.observable.ObservableFromArray@233c0b17

<defer> emitter value is: 11
    <defer> emitter value is: 12
    <defer> emitter value is: 13
    <defer> emitter value is: 14
    <defer> emitter value is: 15

<fromArray> emitter value is: 1
    <fromArray> emitter value is: 2
    <fromArray> emitter value is: 3
    <fromArray> emitter value is: 4
    <fromArray> emitter value is: 5

<转换操作符>
    @Test
    public void testOperatorChange() {
        System.out.println("计算圆的面积:");
        Observable.range(0, 10)
                  .map(value -> {
                      //针对输出格式的说明:如果形式是#.##,则保留两位小数,但是如果小数位低位是0则会不显示,即3.10会显示成3.1
                      //如果形式是#0.00,则同样保留两位小数,但是小数位低位上的0仍然保留,即完整的显示3.10
                      DecimalFormat format = new DecimalFormat("#0.00");
                      String square = format.format(Math.PI *(value * value));
                      return "半径为 " + value + " 的圆面积是: " + square;
                  }).subscribe(s -> System.out.println(s));
        
        System.out.println();
        
        Observable.just(8,9,10,11)
        .flatMap(value ->{
      //.concatMap(value ->{
            List<String> list = new ArrayList<>();
            for(int i =0;i<3;i++) {
                list.add("this value is " + value);
            }
            Thread.sleep(100);
            return Observable.fromIterable(list);
        }).subscribe(s -> System.out.println(s));
        
        System.out.println();
        Observable.range(0, 20)        
       //.buffer(3).subscribe(s -> System.out.println(s));
       .buffer(3,2).subscribe(s -> System.out.println(s));
    }

执行结果:

计算圆的面积:
    半径为 0 的圆面积是: 0.00
    半径为 1 的圆面积是: 3.14
    半径为 2 的圆面积是: 12.57
    半径为 3 的圆面积是: 28.27
    半径为 4 的圆面积是: 50.27
    半径为 5 的圆面积是: 78.54
    半径为 6 的圆面积是: 113.10
    半径为 7 的圆面积是: 153.94
    半径为 8 的圆面积是: 201.06
    半径为 9 的圆面积是: 254.47

this value is 8
    this value is 8
    this value is 8
    this value is 9
    this value is 9
    this value is 9
    this value is 10
    this value is 10
    this value is 10
    this value is 11
    this value is 11
    this value is 11

[0, 1, 2]
    [2, 3, 4]
    [4, 5, 6]
    [6, 7, 8]
    [8, 9, 10]
    [10, 11, 12]
    [12, 13, 14]
    [14, 15, 16]
    [16, 17, 18]
    [18, 19]

代码说明:
     concatMap和flatMap的作用几乎一模一样, 只是它的结果是严格按照上游发送的顺序来发送,
     buffer拥有非常多的重载方法,这里只拿其中的两个来说明:
     bufer(int count):
         该操作符方法会将上游发送的数据切分成多个组,每个组的数量是count个,最后一组有多少就存多少,不足count个时,不会用其他数值进行补充,由此判断每个组切分后的数据没有重复;

bufer(int count,int offset):
         源码中第二个参数定义的是skip,此处按个人理解,感觉使用offset更好解释.该操作符方法将上游的数据进行切分成多个组,每个组的数量也是count个,最后一组有多少就存多少,
         不足count个时,不会用其他数值进行补充,从第二组开始,数值是前一组对应下标上的数值偏移offset之后的值。该方法要求count是大于0的整数,所以当count小于0,无效操作。

Operators(操作符)(创建、转换操作符)相关推荐

  1. RxJava3.0 操作符之转换操作符使用

    RxJava3.0 操作符之转换操作符使用 ​ 转换操作符可用于对Observable发射的数据进行变换,最终观察者接收的是转换后我们需要的数据类型.本文主要介绍一些常用转换操作符的基本使用. 转换操 ...

  2. C++ 重载操作符与转换

    <C++ Primer 4th>读书笔记 重载操作符是具有特殊名称的函数:保留字 operator 后接需定义的操作符号. Sales_item operator+(const Sales ...

  3. 【C++ 语言】类型转换 ( 转换操作符 | const_cast | static_cast | dynamic_cast | reinterpret_cast | 字符串转换 )

    文章目录 I . const_cast 转换操作符 II . static_cast 转换操作符 III . dynamic_cast 转换操作符 IV . reinterpret_cast 转换操作 ...

  4. c++ primer读书笔记-第十四章 重载操作符与转换

    C++ 允许我们重定义操作符用于类类型对象时的含义.如果需要,可以像内置转换那样使用类类型转换,将一个类型的对象隐式转换到另一类型. 例如标准库为容器类定义了几个重载操作符.这些容器类定义了下标操作符 ...

  5. C#中如何利用操作符重载和转换操作符

    操作符重载 有的编程语言允许一个类型定义操作符应该如何操作类型的实例,比如string类型和int类型都重载了(==)和(+)等操作符,当编译器发现两个int类型的实例使用+操作符的时候,编译器会生成 ...

  6. 隐式类型转换与转换操作符operator T

    隐式类型转换与转换操作符 operator T C++ 标准允许隐式类型转换,即对特定的类,在特定条件下,某些参数或变量将隐形转换成类对象 ( 创建临时对象 ) .如果这种转换代价很大 ( 调用类的构 ...

  7. RxJava2 转换操作符之FlatMap()方法

    前言: 本篇基于Map操作符,阅读该篇请确保,你已经了解过它:RxJava2 转换操作符之Map()方法.一如既往,干大事的人都是直接先上图,再解释的.(建议用PC端阅读,图片可以放大.排版,也有利于 ...

  8. RxJava进阶一(创建类操作符)

    RxJava进阶一(创建类操作符) RxJava进阶二(转换类操作符) RxJava进阶三(过滤类操作符) RxJava进阶四(组合类操作符) 前面已经对RxJava原理进行介绍,相信大家对于RXJa ...

  9. 《C++ Primer》之重载操作符与转换(中)

    赋值操作符 类赋值操作符接受类类型形参,通常,该形参是对类类型的 const 引用,但也可以是类类型或对类类型的非 const 引用.如果没有定义这个操作符,则编译器将合成它.类赋值操作符必须是类的成 ...

  10. R语言dataframe创建新的特征(变量)、行加和特征、行均值特征(基于加减乘除、指数、模数等操作符)、创建新的特征(变量)、生成编码特征(基于比较操作符、逻辑操作符)

    R语言dataframe创建新的特征(变量).行加和特征.行均值特征(基于加减乘除.指数.模数等操作符).为dataframe创建新的特征(变量).生成编码特征(基于比较操作符.逻辑操作符) 目录

最新文章

  1. UML-2-迭代、进化和敏捷
  2. 点云网络的论文理解(三)-点云网络的优化 PointNet++的总体说明
  3. latex使用小记录
  4. 自学it18大数据笔记-第三阶段Scala-day06——会持续更新……
  5. [BZOJ1007](HNOI2008)水平可见直线(半平面交习题)
  6. SQL Server 中 EXEC 与 SP_EXECUTESQL 的区别
  7. leetcode 454. 四数相加 II(哈希表)
  8. Python 包管理之 poetry
  9. ajax 获取openid,纯前端获取当前用户的openid(微信小程序)
  10. Java并发编程:synchronized
  11. 在cdh5.1.3中在mapreduce使用hbase
  12. LTE 调制与解调——QPSK,16QAM,64QAM误码率比较
  13. [软件发布]2007考研倒计时软件(完整版+绿色版)
  14. Python Pyecharts模块Map绘制中国地图自定义省份名称
  15. 计算机无法检测到键盘,电脑检测不到键盘怎么办
  16. cephadm全功能安装Ceph Pacfic
  17. 数据结构—栈与队列【顺序存储、链式存储、卡特兰数、优先级队列】
  18. 电商产品设计:商品推荐系统
  19. STM32F103学习记录——通过额外添加串口接口来接入ZigBee/蓝牙模块实现数据的远程传输
  20. My97 日期改变事件

热门文章

  1. (附源码)springboot助农电商系统 毕业设计 081919
  2. Python学习笔记(十五):python 中的面向对象
  3. 用html做祝福语朋友,对朋友的励志祝福语大全
  4. [python]---药品数据分析及预测(包括数据集,源码,报告)
  5. jQuery常用功能大全
  6. Orcad Schematic常用功能
  7. 阿里天池--宫颈癌检测(基于fastRCNN)新手初次尝试
  8. 数据结构例程——串的模式匹配(Brute-Force算法)
  9. 2022.06青少年软件编程(Python)等级考试试卷(四级)
  10. 软件测试员最核心的竞争力究竟是什么