RxJava2之布尔操作符,条件操作符与转换操作符

167 阅读3分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第5天,点击查看活动详情

布尔操作符和条件操作符可用于根据条件发射或变化Observable,或对他们做布尔运算。

布尔操作符

1.all

all操作符用于判断源Observable发射的每一项是否都满足某一个条件,如果全部满足返回true,否则返回false.

all (1).png

Observable.just(1,2,3,4,5)
    .all(new Predicate<Integer>() {
        @Override
        public boolean test(Integer integer) throws Exception {
            return integer<6;
        }
    }).subscribe(new Consumer<Boolean>() {
    @Override
    public void accept(Boolean aBoolean) throws Exception {
        Log.i(TAG, "accept: "+aBoolean);
    }
});

输出结果

 I/TAG: accept: true

2.contains

contains操作符用于判断源Observable发射的数据是否包含某一项数据,如果包含,则返回true,否则返回false.

Observable.just(1,2,3,4,5)
    .contains(1)
    .subscribe(new Consumer<Boolean>() {
        @Override
        public void accept(Boolean aBoolean) throws Exception {
            Log.i(TAG, "accept: "+aBoolean);
        }
    });

输出结果

 I/TAG: accept: true

3.isEmpty

isEmpty操作符用于判断源Observable是否发射过数据,如果发射过,返回false,否则返回true.

 Observable.just(1,2,3,4,5)
    .isEmpty()
    .subscribe(new Consumer<Boolean>() {
        @Override
        public void accept(Boolean aBoolean) throws Exception {
            Log.i(TAG, "accept: "+aBoolean);
        }
    });

输出结果

 I/TAG: accept: false

条件操作符

1.ambArray

ambArray操作符给定两个或多个Observables,它只发射首先发射数据或通知的那个Observable的所有数据.

Observable obs1 = Observable.just(1, 2, 3).delay(1, TimeUnit.SECONDS);
Observable obs2 = Observable.just(4, 5, 6);
Observable.ambArray(obs1, obs2)
        .subscribe(new Consumer<Integer>() {
            @Override
            public void accept(Integer integer) throws Exception {
                Log.i(TAG, "accept: " + integer);
            }
        });

输出结果

 I/TAG: accept: 4
 I/TAG: accept: 5
 I/TAG: accept: 6

2.defaultIfEmpty

如果原始Observable没有发射任何数据正常终止(以onCompleted的形式),defaultIfEmpty返回的Observable就发射提供的默认值。

Observable.create(new ObservableOnSubscribe<Integer>() {
    @Override
    public void subscribe(ObservableEmitter<Integer> emitter) throws Exception {
        emitter.onComplete();
    }
}).defaultIfEmpty(100)
        .subscribe(new Consumer<Integer>() {
            @Override
            public void accept(Integer integer) throws Exception {
                Log.i(TAG, "accept: " + integer);
            }
        });

输出结果

 I/TAG: accept: 100

转换操作符

转换操作符用于将Observable发射的数据转换成另一种数据结构或对象。

1.toList

toList将原始Observable发射经过onNext的数据项组合成一个List,然后再调用onNext方法发射整个列表。

Observable.just(1,2,3)
    .toList()
    .subscribe(new Consumer<List<Integer>>() {
        @Override
        public void accept(List<Integer> integers) throws Exception {
            Log.d(TAG,integers.toString());
        }
    });

输出结果

 D/TAG: [1, 2, 3]

2.toSortedList

toSortedListtoList类似。不过他会对最后的列表进行排序。通过toSortedList(Comparator com)可以指定排序规则。

User user1 = new User("张三丰", 100);
User user2 = new User("萧炎", 30);
User user3 = new User("李东", 40);
User user4 = new User("包拯", 60);

Observable.just(user1, user2, user3, user4)
        .toSortedList(new Comparator<User>() {
            @Override
            public int compare(User o1, User o2) {
                return o1.age - o2.age;
            }
        })
        .subscribe(new Consumer<List<User>>() {
            @Override
            public void accept(List<User> users) throws Exception {
                for (User user : users) {
                    Log.i(TAG, "accept: " + user.toString());
                }
            }
        });

输出结果

 I/TAG: accept: User{name='萧炎', age=30}
 I/TAG: accept: User{name='李东', age=40}
 I/TAG: accept: User{name='包拯', age=60}
 I/TAG: accept: User{name='张三丰', age=100}

3.toMap

toMap将原始Observable发射经过onNext的数据项组合成一个Map(默认HashMap),然后再调用onNext方法发射整个Map。可以通过map(Function fun)指定Map的key.

Observable.just(user1, user2, user3, user4)
        .toMap(new Function<User, String>() {
            @Override
            public String apply(User user) throws Exception {
                return user.getName();
            }
        }).subscribe(new Consumer<Map<String, User>>() {
    @Override
    public void accept(Map<String, User> stringUserMap) throws Exception {
        Log.i(TAG, "accept: " + stringUserMap);
    }
});

输出结果

 I/TAG: accept: {李东=User{name='李东', age=40}, 萧炎=User{name='萧炎', age=30}, 张三丰=User{name='张三丰', age=100}, 包拯=User{name='包拯', age=60}}