Last active
August 29, 2015 14:16
-
-
Save alexcrt/cc56e1c685801ccef1b4 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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