對于一個集合數(shù)據(jù),如果我們需要過濾一些數(shù)據(jù)因妇,Rxjava提供了一系列方法厨相。
數(shù)據(jù):
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("女");}) //從上面過濾的結(jié)果集中選出性別為男的同學
.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()獲取集合中指定個數(shù)的元素
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()獲取集合中后面的指定個數(shù)元素
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'}
與此對應(yīng)的還有個 last() 方法厅贪,從集合中尋找最后一個符合條件的元素
-
skip() 蠢护、skipLast()
阻止集合中指定個數(shù)元素的發(fā)送
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()
發(fā)射指定位置的元素
Observable.from(students)
.elementAt(18) //這里的18是指元素的下標
.subscribe(student -> Log.e(TAG,student.toString()));
輸出:
{id=19, name='小明18號', sex='女', age='36'}
-
sample()
每隔固定時間,獲取該時間間隔內(nèi)發(fā)射的最后一個元素
如果需要獲取該時間間隔內(nèi)养涮,發(fā)射的第一個數(shù)據(jù)使用 throttleFirst() -
timeout()
使用timeout()方法時葵硕,如果超出固定時間間隔Obserable才發(fā)送數(shù)據(jù)眉抬,那么會導致直接調(diào)用Observer的onError方法
-
debounce()
使用debounce()指定一個時間間隔,如果Observable需要發(fā)送一個數(shù)據(jù)懈凹,需要等待固定時間間隔后才能發(fā)送出去蜀变。如果在時間間隔內(nèi)需要發(fā)送N個數(shù)據(jù)
則從第N個數(shù)據(jù)發(fā)射開始等待固定時間間隔,最后只發(fā)送第N個數(shù)據(jù)介评,其余的數(shù)據(jù)都不會發(fā)送库北。