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

Java 如何基于一组值更新数据模型,java,android,rx-java,rx-java2,iterable,Java,Android,Rx Java,Rx Java2,Iterable,该场景是基于整数值的集更新列表中的数据模型 例如,ArrayList具有: Student { name: "abc", id: 1, hasPassed: false }... 现在我有一组整数,基本上 其中的学生ID{1,2,…}表示通过考试的学生的学生ID 我在我的观察者的onNext方法中获得Student的数组列表 如何根据从整数集合中获取的学生ID更新学生对象的hasPassed字段?我正在尝试使用RxJava2来实现这一点。您可以通过使用FlatMapet

该场景是基于整数值的
更新列表中的数据模型

例如,ArrayList具有:

Student {
    name: "abc",
    id: 1,
    hasPassed: false
}...
现在我有一组整数,基本上 其中的学生ID{1,2,…}表示通过考试的学生的学生ID

我在我的
观察者的
onNext
方法中获得
Student
的数组列表


如何根据从整数
集合中获取的学生ID更新学生对象的
hasPassed
字段?我正在尝试使用RxJava2来实现这一点。

您可以通过使用FlatMapeterable()oberator来迭代学生集,该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
    });

首先,可以使用FlatMapeterable()oberator遍历学生集,该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
操作符:

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
布尔值:不可变有很多优点,如果可能,最好使用不可变类。

尽管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
boolean之外:不可变有很多优点,如果可能,最好使用不可变类。

cool!不知道为什么,但我在
}附近遇到了一个“missing return statement”错误我在这里遗漏了什么吗?还是在
}.toList()上的相同错误。subscribe(
查找
}中缺少的返回语句)
@beerBear我忘了告诉你必须将你的可观察对象订阅给观察者,否则流将永远不会执行,请不要说这是伪代码。如果您不熟悉lamda,您可以尝试使用Android studio auto complete并处理operators匿名方法中的类型。@beerBear好的,我刚刚在Android studio上编写了代码,没有错误,我将第二次更新答案:)我正在查找
fromIterable()
。整洁的谢谢你的帮助:)酷!不知道为什么,但我在
}附近遇到了一个“missing return statement”错误我在这里遗漏了什么吗?还是在
}.toList()上的相同错误。subscribe(
查找
}中缺少的返回语句)
@beerBear我忘了告诉你必须将你的可观察对象订阅给观察者,否则流将永远不会执行,请不要说这是伪代码。如果您不熟悉lamda,您可以尝试使用Android studio auto complete并处理operators匿名方法中的类型。@beerBear好的,我刚刚在Android studio上编写了代码,没有错误,我将第二次更新答案:)我正在查找
fromIterable()
。整洁的谢谢你的帮助:)