map操作符
可以将一个对象使用指定的方法转换为另一个对象再发射出去
demo下载地址:
GitHub - GodisGod/Rxjava2Test
https://github.com/GodisGod/Rxjava2Test
代码实战:
根据学生成绩判断老师好坏并打印结果
学生类:使用了Kotlin代码
class Student(name: String = "", score: Int = 0) {
var name = name
var score = score
}
老师类:
public class Teacher {
private String name;
private boolean isGood;
public Teacher(String name, boolean isGood) {
this.name = name;
this.isGood = isGood;
}
//省略了...get/set方法...
@Override
public String toString() {
return "Teacher{" +
"name='" + name + '\'' +
", isGood=" + isGood +
'}';
}
}
map转换单个对象
有一个学生叫LHD,他得了100分。当学生分数大于90分的时候老师为好老师
关键代码:
observableSigle = Observable.create(new ObservableOnSubscribe<Student>() {
@Override
public void subscribe(ObservableEmitter<Student> e) throws Exception {
//学生
Student student = new Student("LHD", 100);
e.onNext(student);
e.onComplete();
}
}).map(new Function<Student, Teacher>() {//使用map操作符进行转换
@Override
public Teacher apply(Student student) throws Exception {
//将学生根据业务要求转换为老师并发射出去
String name = student.getName() + "的老师";
boolean isGood = student.getScore() >= 90;
Teacher teacher = new Teacher(name, isGood);
return teacher;
}
});
//点击按钮触发转换
btnMapSignle.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
tv_map_result.setText("转换单个\n:");
observableSigle
.subscribeOn(Schedulers.io())//io线程发送
.observeOn(AndroidSchedulers.mainThread())//主线程接收
.subscribe(new Consumer<Teacher>() {
@Override
public void accept(Teacher teacher) throws Exception {
Log.i("LHD", teacher.toString());
tv_map_result.append(teacher.toString() + "\n");
}
}, new Consumer<Throwable>() {//异常处理
@Override
public void accept(Throwable throwable) throws Exception {
Log.i("LHD", "Consumer<Throwable> = " + throwable.getMessage());
}
}, new Action() {//最终都会走到这里
@Override
public void run() throws Exception {
Log.i("LHD", "Action");
}
});
}
});
结果:
map转换list
有多个学生,他们得分各不相同。当学生分数大于90分的时候老师为好老师
构建学生list
public class GetBeansUtil {
public static List<Student> getStudents() {
final Student student1 = new Student("LHD", 90);
Student student2 = new Student("LHD1", 80);
Student student3 = new Student("LHD2", 70);
Student student4 = new Student("LHD3", 96);
final List<Student> list = new ArrayList<Student>();
list.add(student1);
list.add(student2);
list.add(student3);
list.add(student4);
return list;
}
}
使用map进行转换
final List<Student> list = GetBeansUtil.getStudents();
//发送list的每个item并使用map转换
observableList = Observable.fromIterable(list)
.map(new Function<Student, Teacher>() {
@Override
public Teacher apply(Student student) throws Exception {
String name = student.getName() + "的老师";
boolean isGood = student.getScore() >= 90;
Teacher teacher = new Teacher(name, isGood);
return teacher;
}
});
//点击按钮开始发射事件
btnMapList.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
tv_map_result.setText("转换list\n:");
observableList
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<Teacher>() {//当调用subscribe才会开始发射事件
@Override
public void accept(Teacher teacher) throws Exception {
Log.i("LHD", teacher.toString());
tv_map_result.append(teacher.toString() + "\n");
}
}, new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) throws Exception {
Log.i("LHD", "Consumer<Throwable> = " + throwable.getMessage());
}
}, new Action() {
@Override
public void run() throws Exception {
Log.i("LHD", "Action");
}
});
}
});
结果:
Teacher{name='LHD的老师', isGood=true}
Teacher{name='LHD1的老师', isGood=false}
Teacher{name='LHD2的老师', isGood=false}
Teacher{name='LHD3的老师', isGood=true}
以上就是map操作符的用法啦。