rxjava : 过滤操作符:filter(条件过滤)、 distinct(去重)、ofType(类型过滤)、buffer(缓存)

filter :

根据过滤规则过滤数据

@Test
public void filter() {
    ArrayList<Student> students = new ArrayList<>();
    students.add(new Student("1", 1));
    students.add(new Student("2", 20));
    students.add(new Student("2", 21));
    students.add(new Student("2", 23));
    students.add(new Student("3", 3));
    students.add(new Student("4", 4));
    students.add(new Student("5", 50));
    students.add(new Student("6", 6));
    students.add(new Student("7", 7));
    Disposable disposable = Observable.fromIterable(students)
            .filter(student -> student.getAge() > 21)
            .subscribe(student ->
                    System.out.println("student==========="
                            + student.toString()));
}
//student===========Student{name='2', age=23}
//student===========Student{name='5', age=50}

distinct : 去重

/**
 * 去重 : distinct
 */
@Test
public void distinct1() {
    Disposable disposable = Observable
    		.just("a", "d", "b", "c", "a", "e", "b", "c", "a", "b")
            .distinct()
            .subscribe(new Consumer<String>() {
                @Override
                public void accept(String s) {
                    System.out.println("s=============" + s);
                }
            });
}
//s=============a
//s=============d
//s=============b
//s=============c
//s=============e

/**
 * 去重对象 : distinct
 */
@Test
public void distinct2() {
    ArrayList<Student> students = new ArrayList<>();
    students.add(new Student("1", 1));
    students.add(new Student("2", 20));
    students.add(new Student("2", 21));
    students.add(new Student("2", 23));
    students.add(new Student("3", 3));
    students.add(new Student("4", 4));
    students.add(new Student("5", 50));
    students.add(new Student("6", 6));
    students.add(new Student("7", 7));
    Disposable disposable = Observable.fromIterable(students)
            .distinct(new Function<Student, String>() {
                @Override
                public String apply(Student student) throws Exception {
                    return student.getName();//如果两个学生name一样就过滤(去重)
                    //return student.getName() + student.getAge(); //如果多个条件同时,可以采取属性拼接的方式
                }
            })
            .subscribe(new Consumer<Student>() {
                @Override
                public void accept(Student student) throws Exception {
                    System.out.println("student==========="
                            + student.toString());
                }
            });
}
//student===========Student{name='1', age=1}
//student===========Student{name='2', age=20}
//student===========Student{name='3', age=3}
//student===========Student{name='4', age=4}
//student===========Student{name='5', age=50}
//student===========Student{name='6', age=6}
//student===========Student{name='7', age=7}
public class Student {

    private String name;
    private int age;

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

distinct : 去重二


   /**
     * 去重对象 2个条件并再次组合成集合 : distinct
     */
    public void distinct3() {
        ArrayList<Student> students = getStudents();

        Disposable disposable = Observable.fromIterable(students)
                .distinct(new Function<Student, Integer>() {
                    @Override
                    public Integer apply(Student student) throws Exception {
                        //返回过滤条件,如果为默认值0,不过滤
                        return student.getAge() != 0 ?
                                student.getAge() :
                                new Random().nextInt(Integer.MAX_VALUE);
                    }
                })
                .distinct(new Function<Student, String>() {
                    @Override
                    public String apply(Student student) throws Exception {
                        //返回过滤条件,如果为空,不过滤
                        return !TextUtils.isEmpty(student.getName()) ?
                                student.getName() :
                                UUID.randomUUID().toString();
                    }
                })
                .toList()   //再合并各个数据
                .subscribe(new Consumer<List<Student>>() {
                    @Override
                    public void accept(List<Student> students) throws Exception {
                        if (students != null) {
                            for (int i = 0; i < students.size(); i++) {
                                System.out.println("students======"
                                        + students.get(i).toString());
                            }
                        }
                    }
                }, new Consumer<Throwable>() {
                    @Override
                    public void accept(Throwable throwable) throws Exception {
                        System.out.println("throwable======"
                                + throwable.getMessage());
                    }
                });
    }
    //students======Student{name='1', age=11, school='11'}
    //students======Student{name='2', age=21, school='21'}
    //students======Student{name='3', age=31, school='31'}
    //students======Student{name='4', age=41, school='41'}
    //students======Student{name='5', age=51, school='51'}
    //students======Student{name='6', age=61, school='61'}
    //students======Student{name='7', age=71, school='71'}
    //students======Student{name='8', age=81, school='81'}
    //students======Student{name='9', age=91, school='91'}
    //students======Student{name='null', age=92, school='92'}
    //students======Student{name='null', age=93, school='93'}
    //students======Student{name='null', age=0, school='95'}
    //students======Student{name='null', age=0, school='96'}
    //students======Student{name='10', age=0, school='101'}

    private ArrayList<Student> getStudents() {
        ArrayList<Student> students = new ArrayList<>();
        students.add(new Student("1", 11, "11"));

        students.add(new Student("2", 21, "21"));
        students.add(new Student("2", 22, "22"));
        students.add(new Student("3", 22, "23"));
        students.add(new Student("3", 31, "31"));
        students.add(new Student("4", 41, "41"));
        students.add(new Student("4", 41, "42"));

        students.add(new Student("5", 51, "51"));
        students.add(new Student("6", 61, "61"));
        students.add(new Student("7", 71, "71"));

        students.add(new Student("8", 81, "81"));
        students.add(new Student("8", 81, "82"));
        students.add(new Student("8", 82, "83"));

        students.add(new Student("9", 91, "91"));
        students.add(new Student(null, 92, "92"));
        students.add(new Student(null, 93, "93"));
        students.add(new Student(null, 93, "94"));
        students.add(new Student(null, 0, "95"));
        students.add(new Student(null, 0, "96"));
        students.add(new Student("10", 0, "101"));
        return students;
    }

public class Student {

    private String name;
    private int age;
    private String school;

    public Student(String name, int age, String school) {
        this.name = name;
        this.age = age;
        this.school = school;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getSchool() {
        return school;
    }

    public void setSchool(String school) {
        this.school = school;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", school='" + school + '\'' +
                '}';
    }
}

ofType : 类型过滤

@Test
public void ofType1() {
    Disposable disposable = Observable.just("first", 2d, 3L, "four", 5, false)
            .ofType(Integer.class)//只需要Integer
            .subscribe(new Consumer<Integer>() {
                @Override
                public void accept(Integer integer) {
                    System.out.println("integer=============" + integer);
                }
            });
}
//integer=============5




//类型过滤
@Test
public void ofType2() {
    Object[] data = {"first", "2", 3, "four", 5, 6, 7};
    Disposable disposable = Observable.fromArray(data)
            .ofType(Integer.class)
            .filter(new Predicate<Integer>() {
                @Override
                public boolean test(Integer integer) throws Exception {
                    return integer > 5;
                }
            })
            .subscribe(new Consumer<Integer>() {
                @Override
                public void accept(Integer integer) throws Exception {
                    System.out.println("integer=============" + integer);
                }
            });
}
//integer=============6
//integer=============7

buffer : 缓存

buffer:隔m(skip)个数取n(count)个数

“buffer”允许您收集值并以批量形式获取它们,而不是一次收集一个值。它们是缓冲值的几种不同方式。

@Test
public void buffer1() {
    Disposable disposable = Observable.range(1, 10)
            .buffer(2)//每次take两个
            .subscribe(System.out::println);
}
//[1, 2]
//[3, 4]
//[5, 6]
//[7, 8]
//[9, 10]




@Test
public void buffer2() {
    //skip分组[1,2,3][4,5,6][7,8,9][10],再take取值
    //当count < skip,元素被排除在外
    Disposable disposable = Observable.range(1, 10)
            .buffer(2, 3)//每次skip三个,只take两个
            .subscribe(System.out::println);
}
//[1, 2]
//[4, 5]
//[7, 8]
//[10]




@Test
public void buffer3() {
    //skip分组[1,2][3,4][5,6][7,8][9,10],再take取值
    //当count > skip,缓冲区重叠
    Disposable disposable = Observable.range(1, 10)
            .buffer(3, 2)
            .subscribe(System.out::println);

}
//[1, 2, 3]
//[3, 4, 5]
//[5, 6, 7]
//[7, 8, 9]
//[9, 10]




@Test
public void buffer4() {
    //skip分组[1,2][3,4][5,6][7,8][9,10],再take取值
    Disposable disposable = Observable.range(1, 10)
            //count : 每个缓冲区应发出的最大大小
            //skip : 开始新的缓冲区之前,应跳过源ObservableSource发出的多少项。
            // 请注意,当{@code skip}和{@code count}相等时,
            // 此操作与 {@link #buffer(int)}相同。
            .buffer(2, 2)
            .subscribe(System.out::println);
}
//[1, 2]
//[3, 4]
//[5, 6]
//[7, 8]
//[9, 10]





@Test
public void buffer5() {
    PublishSubject<String> subject = PublishSubject.create();
    Disposable disposable = subject
            .buffer(3)//获取三个为一组发送
            .subscribe(new Consumer<List<String>>() {
                @Override
                public void accept(List<String> stringList) throws Exception {
                    StringBuilder content = new StringBuilder();
                    for (String s : stringList) {
                        content.append(s).append(",");
                    }
                    System.out.println("content=======" + content);
                }
            });
    subject.onNext("1");
    subject.onNext("2");
    subject.onNext("3");
    subject.onNext("4");
    subject.onNext("5");
    subject.onNext("6");
    subject.onNext("7");
    subject.onNext("8");
    subject.onNext("9");
    subject.onNext("10");
    subject.onComplete();
}
//content=======1,2,3,
//content=======4,5,6,
//content=======7,8,9,
//content=======10,


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值