Skip to content

Instantly share code, notes, and snippets.

@alexcrt
Last active August 29, 2015 14:16
Show Gist options
  • Save alexcrt/cc56e1c685801ccef1b4 to your computer and use it in GitHub Desktop.
Save alexcrt/cc56e1c685801ccef1b4 to your computer and use it in GitHub Desktop.
import java.util.*;
import static java.util.stream.Collectors.*;
import java.util.stream.Stream;
/**
* Created by alex on 23.02.15.
*/
public class MessagesQuery {
public static void main(String... args) {
Collection<Message> myCombinedCollection = getList();
Map<String, Optional<Message>> map = myCombinedCollection.stream().collect(groupingBy(Message::mapping, maxBy(Comparator.comparing(Message::getSendDate))));
List<Message> messages = map.entrySet().stream()
.filter(e -> e.getValue().isPresent())
.map(e -> e.getValue().get())
.collect(toList());
System.out.println(messages);
}
private static Collection<Message> getList() {
Member member1 = new Member(1L);
Member member2 = new Member(2L);
Member member6 = new Member(6L);
//Member 2 sending
//2 -> 1
Message m = new Message(3L, member2, member1, new Date(2015, 2, 28, 0, 0, 0), "Merci pour votre message");
//2 -> 1
Message m2 = new Message(8L, member2, member1, new Date(2015, 2, 28, 1, 0, 0), "Oui j'avais bien eu votre message");
//Member 2 received messages
//1 -> 2
Message m3 = new Message(2L, member1, member2, new Date(2015, 2, 27, 0, 0, 0), "Bonjour je suis disponible");
//1 -> 2
Message m4 = new Message(4L, member1, member2, new Date(2015, 3, 02, 9, 45, 0), "Je suis disponible");
//6 -> 2
Message m5 = new Message(5L, member6, member2, new Date(2015, 3, 01, 0, 0, 0), "Hi there dude");
//1 -> 2
Message m6 = new Message(7L, member1, member2, new Date(2015, 2, 27, 1, 0, 0), "Avez vous eu mon message");
return member2.combined();
}
}
class Message {
public Message(Long id, Member sender, Member recipient, Date sendDate, String text) {
this.id = id;
this.sender = sender;
this.recipient = recipient;
this.sendDate = sendDate;
this.text = text;
this.sender.sentMessages.add(this);
this.recipient.receivedMessages.add(this);
}
public String toString(){
return this.id +"-"+ this.sendDate+":"+text;
}
private Long id;
public Member sender;
private Member recipient;
private Date sendDate;
private boolean messageRead;
private String text;
private Integer version;
public Date getSendDate() {
return sendDate;
}
public Member getSender() {
return sender;
}
public Member getRecipient() {
return recipient;
}
public String mapping() {
long minId = Math.min(sender.id, recipient.id);
long maxId = Math.max(sender.id, recipient.id);
return (maxId + "->" + minId);
}
public int getMapping() {
long minId = Math.min(sender.id, recipient.id);
long maxId = Math.max(sender.id, recipient.id);
return (maxId + "->" + minId).hashCode();
}
}
class Member implements Comparable<Member> {
public Member(Long id) {
this.id = id;
this.sentMessages = new ArrayList<>();
this.receivedMessages = new ArrayList<>();
}
private static final long serialVersionUID = 1L;
public Long id;
public Collection<Message> sentMessages;
public Collection<Message> receivedMessages;
public Collection<Message> combined() {
return Stream.concat(sentMessages.stream(), receivedMessages.stream()).collect(toList());
}
private Integer version;
public String toString(){
return id+"";
}
@Override
public int compareTo(Member o1) {
return Long.compare(id, o1.id);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment