我有两个可观察者:
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解决此问题的建议吗?
答案 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构造函数。