欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android编程开发Rxjava使用技巧

程序员文章站 2022-07-02 19:55:11
android开发rxjava使用技巧。 map 在使用map之前要先说道一个接口:func1,func1和上一篇提到的action1相似。func1 和 action的区别在...

android开发rxjava使用技巧。

map

在使用map之前要先说道一个接口:func1,func1和上一篇提到的action1相似。func1 和 action的区别在于, func1 包装的是有返回值的方法。 接下来就是map的用法,看代码更直观点; 例:得到多个student对象中的name,保存到namelist中

        observable.just(student1, student2, student2)
                //使用map进行转换,参数1:转换前的类型,参数2:转换后的类型
                .map(new func1() {
                    @override
                    public string call(student i) {
                        string name = i.getname();//获取student对象中的name
                        return name;//返回name
                    }
                })
                .subscribe(new action1() {
                    @override
                    public void call(string s) {
                        namelist.add(s);
                    }
                });

可以看到observable中原来的参数是student对象,而最后我们需要的是name,这里使用了map来实现这一转换的过程。当然,map可以多次使用。

        //多次使用map,想用几个用几个
        observable.just("hello", "world")
                .map(new func1() {//将string类型的转化为integer类型的哈希码
                    @override
                    public integer call(string s) {
                        return s.hashcode();
                    }
                })
                .map(new func1() {//将转化后得到的integer类型的哈希码再转化为string类型
                    @override
                    public string call(integer integer) {
                        return integer.intvalue() + "";
                    }
                })
                .subscribe(new action1() {
                    @override
                    public void call(string s) {
                        log.i(tag, s);
                    }
                });

flatmap

flatmap是一个比教难理解的一个转换,在这里先假设一个需求,需要打印多个student所学的课程。这跟之前获取student的name又不同了,这里先确定一下关系,一个student类中只有一个name,而一个student却有多门课程(course),student我们可以理解成这样:

    /**
     * 学生类
     */
    class student {
        private string name;//姓名
        private list courseslist;//所修的课程
        ...
    }
    /**
     * 课程类
     */
    class  course {
        private string name;//课程名
        private string id;
        ...
    }

如果使用map来实现打印所有学生所修个课程名,实现的代码是这样的:

        list students = new arraylist();
        students.add...
        ...

        action1> action1 = new action1>() {
            @override
            public void call(list courses) {
                //遍历courses,输出cuouses的name
                 for (int i = 0; i < courses.size(); i++){
                    log.i(tag, courses.get(i).getname());
                }
            }
        };
        observable.from(students)
                .map(new func1>() {
                    @override
                    public list call(student student) {
                        //返回courseslist
                        return student.getcourseslist();
                    }
                })
                .subscribe(action1);

可以看到,在action1中出现了for来循环打印课程名,使用rxjava就是为了剔除这样的嵌套结构,使得整体的逻辑性更强。这时候就可以使用flatmap了,使用flatmap实现的代码是这样的:

        list students = new arraylist();
        students.add...
        ...

        observable.from(students)
                .flatmap(new func1>() {
                    @override
                    public observable call(student student) {
                        return observable.from(student.getcourseslist());
                    }
                })
                .subscribe(new action1() {
                    @override
                    public void call(course course) {
                        log.i(tag, course.getname());
                    }
                });

可以看出student1、student2经过flatmap后,按顺序依次经历了observable1、observable2,分别转化为course。最后按顺序得到course1、course2、course3、course4、course5、course6,其中1-3由student1得到,4-6由student2得到。
结合代码和示意图,是不是对flatmap有了一定的理解。

注意:flatmap对这些observables发射的数据做的是合并(merge)操作,因此它们可能是交错的。也就说,传入的顺序可能跟出来的顺序不一样。
如果要保证顺的的话,可以使用concatmap。

其他操作符

除了map和flatmap之外,还有其他操作符以供使用。这里就不一一列举他们的用法了,其他常用的操作符如下:

filter:集合进行过滤
each:遍历集合
take:取出集合中的前几个
skip:跳过前几个元素