2017-09-24 202 views
0

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

例如有一个ArrayList:

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

现在我有一个整数集,基本上在其内部具有 学生ID {1,2,...}通过学生表示学生证。

我得到Student arrayList onNext我的observer方法。

如何根据我从整数Set得到的学生ID更新学生对象的hasPassed字段?我正在尝试使用RxJava2来做到这一点。

回答

1

您可以通过使用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 
    }); 
+0

很酷!不知道为什么,但我在'})附近收到“缺失的返回语句”错误;“我在这里错过了什么? – beerBear

+1

我会更新答案 –

+0

在'})。toList()。仍然是相同的错误。subscribe('为一个缺少return语句}} – beerBear

1

即使穆罕默德的答案是可以接受的,也没有必要使用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}); 

在我的例子我用了一个不可变类,所以你不必重复使用相同的用户,但您创建具有相同属性的其他用户,除布尔型:不变性具有许多优点,并且尽可能使用不可变类是一个好主意。