如何基于一组值更新数据模型

时间:2017-09-24 08:14:49

标签: java android rx-java rx-java2 iterable

该方案是基于Set整数值更新列表中的数据模型。

例如,ArrayList具有:

Student {
    name: "abc",
    id: 1,
    hasPassed: false
}...

现在我有一组基本上有的整数 其中的学生ID {1,2,...}表示已通过学生的学生ID。

我在Student的{​​{1}}方法中掌握了onNext的arrayList。

如何根据我从整数observer获得的学生ID更新学生对象的hasPassed字段?我正在尝试使用RxJava2来执行此操作。

2 个答案:

答案 0 :(得分:1)

你可以通过使用flatmapIterable()oberator迭代学生设置,它将逐个发出项目来处理,然后你可以使用flatmap()对发出的项目应用操作,最后如果你想要你的list back使用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
    });

答案 1 :(得分:1)

即使Mohamed的回答是可以接受的,也不需要使用flatMap,因为您不想将一个项目转换为项目流,而只是将项目转换为另一个项目。因此,更好的解决方案是使用map运算符:

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});

在我的例子中,我使用了一个不可变类,所以你不必重用同一个用户,但你创建了另一个具有相同属性的用户,除了hasPassed布尔值:immutability有很多优点,在可能的情况下使用不可变类是个好主意。