1. 程式人生 > >RxJava 2.x 之變換操作符

RxJava 2.x 之變換操作符

變換操作符

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