将对象的 Single 转换为 RxJava 中同一对象的内部字段的 Single

Transform a Single of an object to a Single of an inner field of that same object in RxJava

我有一个嵌入了特征模型的用户模型

public class User {
    private List<Caracteristic> cracteristics;
}

使用 FlowablerxJava 我想获得所有用户的所有特征列表,即将 Single<List<User>> 转换为 Single<List<Caracteristics>>

@Controller("cars")
 public class CaracteristicController() {

     public Single<List<User> list() {
          return Flowable.fromPublisher(
                   getCollection().find(exists("caracteristics")))
                   .toList();
     }

     private MongoCollection<User> getCollection() {
         return dbClient
            .getDatabase(dbConfiguration.getDatabaseName())
            .getCollection(dbConfiguration.getCollectionName(), User.class);
     }

 }

用户模型是 MongoDB 数据库中的一个文档

{
  "name" : "name",
  "caracteristics" : [
    {
    "desc" : "carac 1",
    "ref" : "ROO12"
  },
  {
    "desc" : "carac 2",
    "ref" : "ROO14"
  }]
}

我不知道如何操纵 FlowableSingle 到 return Caracteristic 对象列表而不是用户列表。

您可以使用 flatMapIterable 运算符将所有用户对象的特征列表合并到 Single

public Single<List<Characteristic>> list() {
  return Flowable.fromPublisher(getCollection().find(exists("caracteristics")))
    .flatMapIterable((user) -> user.characteristics)
    .toList();
}

private MongoCollection<User> getCollection() {
  return MongoClients.create()
    .getDatabase("db")
    .getCollection("collection", User.class);
}

如果你想获得所有用户的所有特征列表,你可以这样实现:

Single<List<User>> users = ...;
Single<List<Characteristics>> characteristics = users
    .flatMapObservable(Observable::fromIterable)
    .flatMapIterable(user -> user.characteristics)
    .toList();