我有两个可观察对象,例如:
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/