Android Rx - 将两个 observable 组合成第三个

标签 android rx-java reactive-programming

我有两个可观察对象:

Observable<Contact> contacts = getAllContacts();
Observable<Message> messages = getAllMessages();

从本地数据库获取所有联系人和消息。

联系人类是:

class Contact {
  String name;
  String phoneNumber;
}

消息类是:

class Message {
  String content;
  String fromNumber;
}

我想重新创建一个经典的“线程” View ,例如 SMS/Whatsapp 应用程序。 所以我想“结合”联系人和消息,获得一个 Observable,每个 MessageThread 包含联系人和消息列表,所以 MessageThread 类就像:

class MessageThread {
  Contact contact;
  List<Message> messages;
}

我做了类似的事情:

        Observable<MessageThread> response = messages.zipWith(contacts, (message, contact) -> {
        MessageThread thread = new MessageThread();
        thread.setContact(contact);
        thread.addMessage(message);
        return thread;
    });

但是没有关于电话号码的“检查”,逻辑完全缺失。

关于如何使用 Observables 解决这个问题有什么建议吗?

最佳答案

给你:

contacts
.toMap(contact->contact.phoneNumber, contact->contact)
.flatMap(phones -> messages.toMultiMap(
    message -> phones.get(message.fromNumber))

这应该给你一个 Map<Contact, Collection<Message>> .

编辑:对于 MessageThreads,这应该可以解决问题:

contacts
.toMap(contact->contact.phoneNumber, contact->contact)
.flatMap(phones -> messages.groupBy(message -> phones.get(message.fromNumber))
.flatMap(group -> group.toList().map(list -> new MessageThread(group.getKey(), list)));

当然,假设存在适当的 MessageThread 构造函数。

关于Android Rx - 将两个 observable 组合成第三个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38337612/

相关文章:

java - 将值与 Java8 流结合

android - 即使在 onCreate() 之后,布局尺寸仍然返回 0

java - 我如何将两个字符串数组放入 ListView 中具有多个对象类型的数组列表中

java - 如何在订阅开始时显示对话框?

android - 由于flatMap未完成,因此FlatMap失败后RxJava使用toList

java - 将 Single<List<Item>> 转换为 Observable<Item>?

java - Mono.error 内的日志输出两次

java - webflux spring boot 应用程序的过滤器,返回 ResponseEntity<?>

java - 迭代 R.string.name

android - 从 AsyncTask 返回 JSON 数组