热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

深入浅出RxJava_05[转换操作&数学运算]的代码详细介绍

本教程基于RxJava1.x版本进行全面讲解,后续课程将陆续更新,敬请关注…在观察者和被观察者之间,有些传输的数据需要进行转换之后才能用,比如:有时候拿到的是学校的某个班级学生的名
文章目录[隐藏]
  • 1.Buffer
  • 2.Window
  • 3.Map
  • 4.FlatMap
  • 5.GroupBy
  • 6.Scan
  • 7.Average
  • 8.Max/Min
  • 9.Count
  • 10.Sum

本教程基于RxJava1.x版本进行全面讲解,后续课程将陆续更新,敬请关注…

在观察者和被观察者之间,有些传输的数据需要进行转换之后才能用,比如:有时候拿到的是学校的某个班级学生的名单,但是我们需要知道他们的语文成绩排列。这样就是需要将ArrayList转换成ArrayList队列。

下列提供了一系列的数据切换操作符:

  1. Buffer – 将发送的多个数据变成发送n个队列的数据,每个队列的最大长度为buffer()函数指定的参数大小。

  2. Window – 定期将来自原始Observable的数据分解为一个Observable窗口.

  3. Map – 将某个发送的数据转换成另外一个数据

  4. flatMap – 实际上就是将发送的一个类型的数据转换成另外一个数据类型的对象

  5. GroupBy – 根据指定的key将相同类型的发送数据存入到n个子Observable中。

  6. Scan – 对所有的发送数据进行某个函数运行,将第n和第n+1项进行计算,计算后的结果再和n+2项进行运行,一次类推。

1.Buffer

比如下面的数据,分别发送三个字符串

Observable.just("Hello Android !", "Hello Java", "Hello C");

如果我们在该被观察者后面添加buffer操作符,并指定缓存2项,代码如下:

final Observable observable = Observable.just("Hello Android !", "Hello Java", "Hello C");Observable> bufferObservable = observable.buffer(2);

那么它会第一次发送2个List数据,分别是:

List(){"Hello Android !", "Hello Java"}List(){"Hello C"}

下面的完整示例代码如下:

//这里模拟正常发送三个单一值的被观察者final Observable observable = Observable.just("Hello Android !", "Hello Java", "Hello C");//定义一个缓存的被观察者 每次缓存2个 缓存的数据自上面observable对象获取Observable> bufferObservable = observable.buffer(2);//订阅对象并获取缓存被观察者发送出来的数据bufferObservable.subscribe(new Action1>() {    @Override    public void call(List strings) {        Log.i(TAG, "call:--------");        for (int i = 0; i 

输出

call:--------call: Hello Android !call: Hello Javacall:--------call: Hello C

buffer()实际上就是将发送的n个数据转换成发送x个队列

2.Window

定期将来自原始Observable的数据分解为一个Observable窗口,发射这些窗口,而不是每次发射一项数据

Window和Buffer类似,但不是发射来自原始Observable的数据包,它发射的是Observables,这些Observables中的每一个都发射原始Observable数据的一个子集,最后发射一个onCompleted通知。

Observable.just(1, 2, 3, 4, 5)//将一个Observable发射出去的数据分解为多个Observable对象 每个Observable发射2个数据            .window(2)            .subscribe(new Action1>() {                @Override                public void call(Observable innerObservable) {                    Log.i(TAG, "call: ---------");                    innerObservable.subscribe(new Action1() {                        @Override                        public void call(Integer value) {                            Log.i(TAG, "call: "+value);                        }                    });                }            });

输出:

 call: --------- call: 1 call: 2 call: --------- call: 3 call: 4 call: --------- call: 5

3.Map

学校新生入住。在数据录入的时候,发现张三的名字录入出错,应该改为张三丰。现在 我们要重新为他录入信息。代码如下:

private ArrayList initPersons() {    ArrayList persOns= new ArrayList<>();    persons.add(new Student("张三", 16));    persons.add(new Student("李四", 17));    persons.add(new Student("王二麻子", 18));    return persons;}ArrayList students = initPersons();for (int i = 0; i 

RxJava这样转换:

Observable.from(initPersons())            //将张三的名字改为张三丰            .map(new Func1() {                @Override                public Student call(Student student) {                     //循环检查每个学生的名字,如果找到张三 则改为张三丰                    if (student.name.equals("张三")){                        student.name="张三丰";                    }                    return student;                }            })            .subscribe(new Action1() {                @Override                public void call(Student student) {                    Log.i(TAG, "call: "+student);                }            });

map()实际上就是将某个发送的数据转换成另外一个数据

4.FlatMap

今天学校组建了体操队。学校又招了几个学生 代码如下:

private ArrayList initStudents() {    ArrayList persOns= new ArrayList<>();    persons.add(new Student("张三", 11));    persons.add(new Student("李四", 12));    persons.add(new Student("王二麻子", 13));    persons.add(new Student("李雷", 19));    persons.add(new Student("韩梅梅", 18));    persons.add(new Student("韩红", 17));    return persons;}

上级要求,学体操要从娃娃抓起,让我们找出年龄小于15岁的学生,组建一个体操队,并且给小学生创建一个特定的小学生类。

public static class LittleStudent extends Student{    public LittleStudent(String name, int age) {        super(name, age);    }}

于是代码如下:

ArrayList students = initStudents();//封装小学生集合ArrayList littleStudents=new ArrayList<>();for (int i = 0; i 

RxJava这样转换:

Observable.from(initStudents())            .flatMap(new Func1>() {                @Override                public Observable call(Student student) {                    if (student.age<15){                        return Observable.just(new LittleStudent(student.name,student.age));                    }                    return null;                }            })            .subscribe(new Action1() {                @Override                public void call(LittleStudent littleStudent) {                    Log.i(TAG, "call: "+littleStudent);                }            });

flatMap()实际上就是将发送的一个类型的数据转换成另外一个数据类型的对象

5.GroupBy

将一个Observable分拆为一些Observables集合,它们中的每一个发射原始Observable的一个子序列。哪个数据项由哪一个Observable发射是由groupBy内部的函数判定的,这个函数给每一项指定一个Key,Key相同的数据会被同一个Observable发射。它返回Observable的一个特殊子类GroupedObservable,实现了GroupedObservable接口的对象有一个额外的方法getKey,这个Key用于将数据分组到指定的Observable。

//模拟学校录入的一系列的同名学生信息private Observable getPersons(){    return Observable.from(new Person[]{            new Person("zhangsan",18),            new Person("zhangsan",20),            new Person("lisi",19),            new Person("lisi",33),            new Person("wangwu",20),            new Person("wangwu",22),            new Person("wangwu",21)    });}

实现归类调用

final Observable> observable = getPersons()        //根据用户的名称来归类        .groupBy(new Func1() {            @Override            public String call(Person person) {                return person.name;            }        });observable.subscribe(new Action1>() {    //每归一类 则调用一次该方法    @Override    public void call(GroupedObservable observablelist) {        Log.i(TAG, "call: ----"+observablelist.getKey());        //打印队列中的每个元素        observablelist.subscribe(new Action1() {            @Override            public void call(Person person) {                Log.i(TAG, "call: "+person.name+"  "+person.age);            }        });    }});

根据指定的key将相同类型的发送数据存入到n个子Observable中

6.Scan

Scan操作符对原始Observable发射的第一项数据应用一个函数,然后将那个函数的结果作为自己的第一项数据发射。它将函数的结果同第二项数据一起填充给这个函数来产生它自己的第二项数据。它持续进行这个过程来产生剩余的数据序列。这个操作符在某些情况下被叫做accumulator。

比如我们想从1加到5,思路是这样的:

 1+2=3; 3+3=6; 6+4=10;10+5=15;

RxJava这样转换:

//实现从1加到5的总数Observable.just(1, 2, 3, 4, 5)    .scan(new Func2() {        //定义每个子项的合并规则        @Override        public Integer call(Integer sum, Integer item) {            return sum + item;        }    })    .subscribe(new Action1() {        @Override        public void call(Integer result) {            Log.i(TAG, "call: " + result);        }    });

输出

Next: 1Next: 3Next: 6Next: 10Next: 15Sequence complete.

对所有的发送数据进行某个函数运行,将第n和第n+1项进行计算,计算后的结果再和n+2项进行运行,一次类推


在开发的过程,不可避免的会使用某些常见的数学计算,比如计算一个队列的平均数/求和/最大最小值/获取个数等等

关于数学的计算,这里RxJava提供了一个依赖包。其下载的地址是RxJavaMath

其开发包提供了一个核心帮助类:MathObservable

7.Average

求某个队列的平均数,这个队列可以是int类型 也可以是double类型等。以下例子计算1到6的平均数

Observable o1 =            MathObservable.averageInteger(Observable.just(1,2,3,4,5,6));o1.subscribe(new Action1() {    @Override    public void call(Integer integer) {        Log.i(TAG, "call: "+integer);    }});

8.Max/Min

Min操作符操作一个发射数值的Observable并发射单个值:最小的那个值。
Max操作符操作一个发射数值的Observable并发射单个值:最大的那个值。

以下例子列出1到6的最小值:

Observable o1 =            MathObservable.min(Observable.just(1,2,3,4,5,6));o1.subscribe(new Action1() {    @Override    public void call(Integer integer) {        Log.来2源gaodaima#com搞([email protected]&网i(TAG, "call: "+integer);    }});

以下例子列出1到6的最大值:

Observable o1 =            MathObservable.max(Observable.just(1,2,3,4,5,6));o1.subscribe(new Action1() {    @Override    public void call(Integer integer) {        Log.i(TAG, "call: "+integer);    }});

9.Count

count函数主要列出发送队列的个数。

Observable o1 =Observable.just(1,2,3,4,5,4);Observable count = o1.count();count.subscribe(new Action1() {    @Override    public void call(Integer integer) {            //打印出6        Log.i(TAG, "call: "+integer);    }});

10.Sum

计算Observable发射的数值的和并发射这个和.

RxJava的实现是sumDouble, sumFloat, sumInteger, sumLong,它们不是RxJava核心模块的一部分,属于rxjava-math模块。你可以使用一个函数,计算Observable每一项数据的函数返回值的和。

Observable o1 =            MathObservable.sumInteger(Observable.just(1,2,3,4,5,4));o1.subscribe(new Action1() {    @Override    public void call(Integer integer) {        Log.i(TAG, "call: "+integer);    }});

以上就是深入浅出RxJava_05[转换操作&数学运算]的代码详细介绍的内容,更多相关内容请关注(www.gaodaima.com)!



推荐阅读
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • Android JSON基础,音视频开发进阶指南目录
    Array里面的对象数据是有序的,json字符串最外层是方括号的,方括号:[]解析jsonArray代码try{json字符串最外层是 ... [详细]
author-avatar
Stupid锋_891
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有