对于一个集合数据,如果我们需要过滤一些数据,Rxjava提供了一系列方法。
数据:
public class Student {
public int id;
public String name;
public String sex;
public int age;
}
public List<Student> getStudents(){
Student student=null;
List<Student> students=new ArrayList<>();
for(int i=0;i<20;i++){
student=new Student(i+1,"小明"+i+"号",i%3==0?"女":"男",i+18);
students.add(student);
}
return students;
}
-
filter()
基本使用:filter方法会将集合中的每个元素都传入Func1中的call方法。如果为true表示为我们需要的元素,反之。
filter(new Func1<Student, Boolean>() {
@Override
public Boolean call(Student student) {
return false;
}
})
如果我们希望从学生中选出年龄在 20~25岁之间的女同学,该怎么办呢?
List<Student> students=getStudents();
Observable.from(students)
.filter(new Func1<Student, Boolean>() { //过滤年龄在20~25的学生
@Override
public Boolean call(Student student) {
return student.age>=20&&student.age<=25;
}
})
.filter(student1 -> {return student1.sex.equals("女");}) //从上面过滤的结果集中选出性别为男的同学
.subscribe(student -> Log.e(TAG,student.toString()));
输出:
Student{id=4, name='小明3号', sex='女', age='21'}
Student{id=7, name='小明6号', sex='女', age='24'}
-
take()
take()获取集合中指定个数的元素
Observable.from(students)
.take(2)
.subscribe(student -> Log.e(TAG,student.toString()));
输出:
Student{id=1, name='小明0号', sex='女', age='18'}
Student{id=2, name='小明1号', sex='男', age='19'}
-
takeLast()
takeLast()获取集合中后面的指定个数元素
Observable.from(students)
.takeLast(2)
.subscribe(student -> Log.e(TAG,student.toString()));
输出:
Student{id=19, name='小明18号', sex='女', age='36'}
Student{id=20, name='小明19号', sex='男', age='37'}
-
repeat()
如果你想复制一个集合,使用repeat()方法
Observable.from(students)
.takeLast(2)
.repeat(2)
.subscribe(student -> Log.e(TAG,student.toString()));
输出:
Student{id=19, name='小明18号', sex='女', age='36'}
Student{id=20, name='小明19号', sex='男', age='37'}
Student{id=19, name='小明18号', sex='女', age='36'}
Student{id=20, name='小明19号', sex='男', age='37'}
-
distinct()
如果一个集合中有重复的元素,我们需要去重,使用distinct()方法
Observable.from(students)
.takeLast(2)
.repeat(2)
.distinct()
.subscribe(student -> Log.e(TAG,student.toString()));
输出:
Student{id=19, name='小明18号', sex='女', age='36'}
Student{id=20, name='小明19号', sex='男', age='37'}
-
first
获取集合中第一个符合条件的元素
Observable.from(students)
.first(new Func1<Student, Boolean>() {
@Override
public Boolean call(Student student) {
return student.sex.equals("男");
}
}) //从集合中寻找第一个为男性的同学
.subscribe(student -> Log.e(TAG,student.toString()));
输出:
Student{id=2, name='小明1号', sex='男', age='19'}
Observable.from(students)
.first()// 没有寻找条件,就是找集合中的第一个同学
.subscribe(student -> Log.e(TAG,student.toString()));
输出:
Student{id=1, name='小明0号', sex='女', age='18'}
与此对应的还有个 last() 方法,从集合中寻找最后一个符合条件的元素
-
skip() 、skipLast()
阻止集合中指定个数元素的发送
Observable.from(students)
.skip(18) //阻止前面18个同学输出
.subscribe(student -> Log.e(TAG,student.toString()));
输出:
Student{id=19, name='小明18号', sex='女', age='36'}
Student{id=20, name='小明19号', sex='男', age='37'}
Observable.from(students)
.skipLast(18) //阻止后面18个同学输出
.subscribe(student -> Log.e(TAG,student.toString()));
输出:
Student{id=1, name='小明0号', sex='女', age='18'}
Student{id=2, name='小明1号', sex='男', age='19'}
-
elementAt()
发射指定位置的元素
Observable.from(students)
.elementAt(18) //这里的18是指元素的下标
.subscribe(student -> Log.e(TAG,student.toString()));
输出:
{id=19, name='小明18号', sex='女', age='36'}
-
sample()
每隔固定时间,获取该时间间隔内发射的最后一个元素
如果需要获取该时间间隔内,发射的第一个数据使用 throttleFirst() -
timeout()
使用timeout()方法时,如果超出固定时间间隔Obserable才发送数据,那么会导致直接调用Observer的onError方法
-
debounce()
使用debounce()指定一个时间间隔,如果Observable需要发送一个数据,需要等待固定时间间隔后才能发送出去。如果在时间间隔内需要发送N个数据
则从第N个数据发射开始等待固定时间间隔,最后只发送第N个数据,其余的数据都不会发送。
网友评论