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