我有两个可观察对象,例如:

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


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

Contact类是:

class Contact {
  String name;
  String phoneNumber;
}


Message类是:

class Message {
  String content;
  String fromNumber;
}


我想重新创建经典的“线程”视图,例如SMS / Whatsapp应用程序。
因此,我想“合并”联系人和消息,以获得一个Observable,每个MessageThread包含Contact和消息列表,因此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 - Android Rx-将两个可观察到的东西合并到第三个,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38337612/

10-10 16:00