如何根据一组值更新数据模型
How to Update a Data Model based on a set of values
场景是根据 Set
个整数值更新列表中的数据模型。
例如一个 ArrayList 有:
Student {
name: "abc",
id: 1,
hasPassed: false
}...
现在我有一组整数,基本上有
其中的学号 {1, 2, ...} 表示通过学生的学号。
我在 observer
.
的 onNext
方法中获取了 Student
的数组列表
如何根据从整数 Set
中获得的学生 ID 更新学生对象的 hasPassed
字段?我正在尝试使用 RxJava2 来执行此操作。
您可以首先使用 flatmapIterable() oberator 遍历学生集合,它会一个接一个地发出要处理的项目,然后您可以使用 flatmap() 对发出的项目应用操作,最后如果您希望您的列表返回使用 toList() 运算符..它可能看起来像
Observable.fromIterable(studentList) //emit items one by one
.flatMap(studentItem -> { //make an operation on item
if (ids.contains(studentItem.getId())) {
studentItem.setHasPassed(true);
}
return Observable.just(studentItem); //emit item
})
.toList() //get all items on a list
.subscribe(finalList->{
//handle the result
}, throwable -> {
//handlle error
});
即使 Mohamed 的回答可以接受,也没有必要使用 flatMap
,因为您不想将一个项目转换为项目流,而只是将项目转换为另一个项目。所以更好的解决方案是使用 map
operator:
Observable.fromIterable(list)
.map(student -> {
if (getPassedIds().contains(student.getId())) {
return new Student(student.getId(), student.getName(), true);
} else {
return student;
}
})
.toList()
.subscribe(students -> students.forEach(student -> logd(student.toString())),
throwable -> { //handle error});
在我的示例中,我使用了不可变 class,因此您不必重复使用同一个用户,而是创建另一个具有相同属性的用户,hasPassed
布尔值除外:不变性有很多优点,尽可能使用不可变的 classes 是个好主意。
场景是根据 Set
个整数值更新列表中的数据模型。
例如一个 ArrayList 有:
Student {
name: "abc",
id: 1,
hasPassed: false
}...
现在我有一组整数,基本上有 其中的学号 {1, 2, ...} 表示通过学生的学号。
我在 observer
.
onNext
方法中获取了 Student
的数组列表
如何根据从整数 Set
中获得的学生 ID 更新学生对象的 hasPassed
字段?我正在尝试使用 RxJava2 来执行此操作。
您可以首先使用 flatmapIterable() oberator 遍历学生集合,它会一个接一个地发出要处理的项目,然后您可以使用 flatmap() 对发出的项目应用操作,最后如果您希望您的列表返回使用 toList() 运算符..它可能看起来像
Observable.fromIterable(studentList) //emit items one by one
.flatMap(studentItem -> { //make an operation on item
if (ids.contains(studentItem.getId())) {
studentItem.setHasPassed(true);
}
return Observable.just(studentItem); //emit item
})
.toList() //get all items on a list
.subscribe(finalList->{
//handle the result
}, throwable -> {
//handlle error
});
即使 Mohamed 的回答可以接受,也没有必要使用 flatMap
,因为您不想将一个项目转换为项目流,而只是将项目转换为另一个项目。所以更好的解决方案是使用 map
operator:
Observable.fromIterable(list)
.map(student -> {
if (getPassedIds().contains(student.getId())) {
return new Student(student.getId(), student.getName(), true);
} else {
return student;
}
})
.toList()
.subscribe(students -> students.forEach(student -> logd(student.toString())),
throwable -> { //handle error});
在我的示例中,我使用了不可变 class,因此您不必重复使用同一个用户,而是创建另一个具有相同属性的用户,hasPassed
布尔值除外:不变性有很多优点,尽可能使用不可变的 classes 是个好主意。