一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第5天,点击查看活动详情。
布尔操作符和条件操作符可用于根据条件发射或变化Observable,或对他们做布尔运算。
布尔操作符
1.all
all操作符用于判断源Observable发射的每一项是否都满足某一个条件,如果全部满足返回true,否则返回false.
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
toSortedList与toList类似。不过他会对最后的列表进行排序。通过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}}