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

时间:2016-07-12 19:42:28

标签: android rx-java reactive-programming

我有两个可观察者:

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

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

Contact类是:

class Contact {
  String name;
  String phoneNumber;
}

Message类是:

class Message {
  String content;
  String fromNumber;
}

我想重新创建一个经典的&#34;线程&#34;查看,像SMS / Whatsapp应用程序。 所以我想&#34;结合&#34;联系人和消息,获取一个Observable,每个MessageThread包含Contact和Message(s)列表,因此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;
    });

但是没有&#34;检查&#34;关于电话号码,逻辑完全缺失。

有关如何使用Observables解决此问题的建议吗?

1 个答案:

答案 0 :(得分:1)

这里你去:

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构造函数。