Map操作符
Map操作符,是將獲取到的數據類型進行轉換的一個操作符。他可以將具體從網絡端或者其他地方獲取到的數據,通過自己編寫的方法進行轉化成任何你需要的數據類型並返回,交給相應的方法去處理。
Observable.create(new ObservableOnSubscribe<String>() {
@Override
public void subscribe(ObservableEmitter<String> e) throws Exception {
e.onNext("1");
e.onNext("2");
e.onNext("3");
}
}).map(new Function<String, Integer>() {
@Override
public Integer apply(String s) throws Exception {
return Integer.parseInt(s);
}
}).subscribe(new Consumer<Integer>() {
@Override
public void accept(Integer integer) throws Exception {
Log.i("result",integer + "");
}
});
這裏看到,我們在上游的發射器中發射了三個字符串數字,'1','2','3'。然後通過Map這個操作符將三個數字轉化爲int類型的數,最後打印出來。
具體應用
我們在進行網絡請求的時候,如果後臺返回來了一串json字符串,我們可以在Map操作符中定義一個方法,通過Gson或者FastJson將json字符串轉化成爲相應的數據bean類型,然後返回給下游,之後我們就可以方便的操作這些對象的set、get方法了。
我們先定義一個json字符串來模擬從網絡端獲取的數據
{
"name":"Tome",
"age":"15",
"sex":"man"
}
然後根據這個json寫一個類Perosn
public class Person {
/**
* name : Tome
* age : 15
* sex : man
*/
private String name;
private String age;
private String sex;
public void setName(String name) {
this.name = name;
}
public void setAge(String age) {
this.age = age;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getName() {
return name;
}
public String getAge() {
return age;
}
public String getSex() {
return sex;
}
}
最後我們使用RxJava的Map操作符來處理這個請求
Observable.create(new ObservableOnSubscribe<String>() {
@Override
public void subscribe(ObservableEmitter<String> e) throws Exception {
e.onNext(json);
}
}).map(new Function<String, Person>() {
@Override
public Person apply(String s) throws Exception {
Gson gson = new Gson();
return gson.fromJson(json, Person.class);
}
}).subscribe(new Consumer<Person>() {
@Override
public void accept(Person person) throws Exception {
Log.i("result",person.getName());
Log.i("result",person.getAge());
Log.i("result",person.getSex());
}
});
我們看到我們在上游用onNext()方法發射了這個json字符串,然後在中間用map方法通過Gson解析將json字符串解析成爲我們之前定義的那個Person類,最後在下游接收到這個類型之後log打印出來相應的數據,我們便完成了所有的操作。是不是特別方便?
其實通過這個我們還可以對一個Url圖片進行出處理,通過拿到這個圖片的Url,將其轉換成爲Bitmap然後返回,之後我們直接將這個Bitmap set到相應的位置上即可。
flatMap操作符
flatMap操作符是將獲取到的一個元素變化成多個元素之後,通過Observable再次發射出去,之後再由下游進行接收處理。
例如我們在從網絡端獲取到一個json字符串之後,裏面有個對象是個集合對象,我們可以先獲取到這個對象,之後再將這個集合對象發射出去,從而直接在下游拿到這個對象操作它,達到我們的目的。
說白了,Map操作符他的操作是一對一的操作,一次只能操作一個對象,處理完成之後也是返回一個對象,但是FlatMap操作符卻不同,它一次可以操作多個對象,他的對應關係爲一對多或者多對多。 在FlatMap的內部,其實是還有一個Observable發射器,當我們將數據處理完成只有,再由一個內部的發射器將這些數據發射出去,從而達到我們一對多或者多對多的目的。
這裏需要注意,flatMap對於數據的操作和發射並不是順序的,而是隨機處理的,所以你發射出去的數據可能經過flatMap之後數據的順序會發生改變,如果我們不想讓數據順序發生改變,我們可以使用concatMap操作符
filter操作符
顧名思義,過濾操作符。我們可以將獲取到的數據進行一次條件過濾,從而獲取到我們想要的數據
Observable.just(1,2,3,4,5,6,7)
.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 {
Log.i("result:",integer + "");
}
});
上面我們將小於5的數據進行了過濾,從而獲取到了6,7這兩個數字。
interval
輪詢操作符。我們可以通過這個操作符來指定一段時間進行輪詢操作。我們可以用來他寫一個倒計時的計數器。
privat int time = 60;
Observable.create(new ObservableOnSubscribe<Integer>() {
@Override
public void subscribe(ObservableEmitter<Integer> e) throws Exception {
if (time > 0){
e.onNext(time -- );
}else {
e.onComplete();
}
}
}).interval(1,TimeUnit.SECONDS)
.subscribe(new Consumer<Long>() {
@Override
public void accept(Long aLong) throws Exception {
}
});
我們在這裏寫一個定時器,規定每隔一秒鐘發射一個數據,並且這個變量每次發射完成之後都自減一,一旦減到零,便停止發射。