RxJava 2.x 之變換操作符
阿新 • • 發佈:2018-11-01
變換操作符
- map操作符
- flatMap操作符
- flatMapIterable操作符
- concatMap操作符
- switchMap操作符
- cast操作符
- scan操作符
- buffer操作符
- toList操作符
- groupBy操作符
- toMap操作符
map
map操作符作為基本的轉換操作符,可以把每一個元素轉換成新的元素髮射
Observable.just(0, 1, 2, 3, 4, 5)
.map(new Function<Integer, String>() {
@Override
public String apply(Integer integer) throws Exception {
return "apply " + integer;
}
})
.subscribe(new CommonComsumer<>());
輸出:
accept apply 0
accept apply 1
accept apply 2
accept apply 3
accept apply 4
accept apply 5
Process finished with exit code 0
flatMap
flatMap操作符將每個元素轉換成被觀察者,每個被觀察者傳送的元素會合併成新的被觀察者,順序輸出
Student類
public class Student {
public int age;
public String name;
public List<Integer> courses;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<Integer> getCourses() {
return courses;
}
public void setCourses(List<Integer> courses) {
this.courses = courses;
}
public static List<Student> create() {
List<Student> students = new ArrayList<>();
Student student;
for (int i = 0; i < 5; i++) {
student = new Student();
student.setAge(i);
student.setName("name " + i);
student.setCourses(Arrays.asList(1, 2, 3));
students.add(student);
}
return students;
}
}
List<Student> students = Student.create();
Observable.fromIterable(students)
.flatMap(value -> {
return Observable.fromIterable(value.courses);
}).subscribeWith(new CommonObserver<>());
輸出:
onNext 1
onNext 2
onNext 3
onNext 1
onNext 2
onNext 3
onNext 1
onNext 2
onNext 3
onNext 1
onNext 2
onNext 3
onNext 1
onNext 2
onNext 3
onComplete
Process finished with exit code 0
flatMapIterable
flatMapIterable操作符與flatMap類似,但它可以將每個元素轉化成iterable
List<Student> students = Student.create();
Observable.fromIterable(students)
.flatMapIterable(new Function<Student, Iterable<Integer>>() {
@Override
public Iterable<Integer> apply(Student student) throws Exception {
return student.courses;
}
}).subscribeWith(new CommonObserver<>());
輸出:
onNext 1
onNext 2
onNext 3
onNext 1
onNext 2
onNext 3
onNext 1
onNext 2
onNext 3
onNext 1
onNext 2
onNext 3
onNext 1
onNext 2
onNext 3
onComplete
Process finished with exit code 0
concatMap
concatMap操作符和flatMap類似,flatMap內部通過merge合併元素,順序可能會錯亂,但是concatMap內部安裝concat合併元素,按照順序發射
List<Student> students = Student.create();
Observable.fromIterable(students)
.concatMap(value -> {
return Observable.fromIterable(value.courses);
}).subscribeWith(new CommonObserver<>());
輸出:
onNext 1
onNext 2
onNext 3
onNext 1
onNext 2
onNext 3
onNext 1
onNext 2
onNext 3
onNext 1
onNext 2
onNext 3
onNext 1
onNext 2
onNext 3
onComplete
Process finished with exit code 0
switchMap
switchMap操作符每次轉換出來新的資料都會取代前一個被觀察者
Observable.just(0, 1, 2)
.switchMap(value -> {
return Observable.timer(1, TimeUnit.SECONDS).map(longValue -> value);
}).subscribeWith(new CommonObserver<>());
輸出:
onNext 2
onComplete
Process finished with exit code 0
cast
cast操作符主要用來強制轉換每一個元素的型別
Observable.just(1, 2, 3, 4, 5)
//把每個元素都轉換成Number型別,然後再發射
.cast(Number.class).subscribeWith(new CommonObserver<>());
輸出:
onNext 1
onNext 2
onNext 3
onNext 4
onNext 5
onComplete
Process finished with exit code 0
scan
scan操作符掃描每一個元素,忽略第一個元素,從第二個元素開始進行變換後返回
Observable.just(1, 2, 3, 4, 5)
.scan(new BiFunction<Integer, Integer, Integer>() {
@Override
public Integer apply(Integer value1, Integer value2) throws Exception {
return value2 + 1;
}
}).subscribeWith(new CommonObserver<>());
輸出:
onNext 1
onNext 3
onNext 4
onNext 5
onNext 6
onComplete
Process finished with exit code 0
buffer
buffer操作符主要用來把多個元素打包成一個元素一次過傳送資料
Observable.just(1, 2, 3, 4, 5, 6, 7, 8)
.buffer(3).subscribeWith(new CommonObserver<>());
輸出:
onNext [1, 2, 3]
onNext [4, 5, 6]
onNext [7, 8]
onComplete
Process finished with exit code 0
toList
toList操作符主要用來把所有元素轉換成一個List一次過傳送出去
Observable.just(1, 2, 3, 4, 5, 6, 7, 8)
.toList().subscribe(new CommonComsumer<>());
輸出:
accept [1, 2, 3, 4, 5, 6, 7, 8]
Process finished with exit code 0
groupBy
groupBy操作符會將接收到的資料分組key
Observable.just(1, 2, 3, 4, 5, 6, 7, 8)
.groupBy(new Function<Integer, String>() {
@Override
public String apply(Integer integer) throws Exception {
return integer >= 5 ? "A組" : "B組";
}
}).subscribe(new Consumer<GroupedObservable<String, Integer>>() {
@Override
public void accept(GroupedObservable<String, Integer> observable) throws Exception {
observable.subscribe(new Consumer<Integer>() {
@Override
public void accept(Integer integer) throws Exception {
String key = observable.getKey();
System.out.println(key + ":" + String.valueOf(integer));
}
});
}
});
輸出:
B組:1
B組:2
B組:3
B組:4
A組:5
A組:6
A組:7
A組:8
Process finished with exit code 0
toMap
toMap操作符主要用來將元素轉換成key,value對應的map
Observable.just(1, 2, 3, 4, 5, 6, 7, 8)
.toMap(new Function<Integer, String>() {
@Override
public String apply(Integer integer) throws Exception {
return integer >= 5 ? "A組" : "B組";
}
}).subscribe(new CommonComsumer<>());
輸出:
accept {B組=4, A組=8}
Process finished with exit code 0
複習文件
https://github.com/byhook/rxjava2-study
參考:
https://maxwell-nc.github.io/android/rxjava2-6.html