2016-10-19 11 views
1

Wer weiß, wie man eine java 8 type distinct function schreibt, um über eine Liste von Benutzerklicks zu streamen und deutlich zu machen (basierend auf url), aber die mit dem späteren Zeitstempel zu behalten ?Java 8. Liste der Objekte. Wollen Sie basierend auf einer Eigenschaft basierend auf der Eigenschaft unterscheidet

action=click, url=www.google.com, timestamp=10 
action=click, url=www.google.com, timestamp=20 
action=click, url=www.abc.com/123, timestamp=10 
action=click, url=www.grassisgreener.com, timestamp=10 
action=click, url=www.grassisgreener.com, timestamp=46 

sollte Das Endergebnis

seine
action=click, url=www.google.com, timestamp=20 
action=click, url=www.abc.com/123, timestamp=10 
action=click, url=www.grassisgreener.com, timestamp=46 

Antwort

3

Eine Idee wäre, den Inhalt der Liste in eine Karte zu sammeln, wo der Schlüssel für jedes Element der URL ist, wird der Wert des Klick-Metadaten des Benutzers und die Funktion verwendet, um die Kollision zu lösen behält den Eingang mit dem höchsten Datenstand:

.stream().collect(toMap(e -> e.getUrl(), 
         e -> e, 
         (e1, e2) -> e1.getTimestamp() > e2.getTimestamp() ? e1 : e2)); 

von dort aus können Sie die Werte dieser Karte nehmen, die Ihnen eine Sammlung von t Die letzten Klicks für jede andere URL.

+3

Die Merge-Funktion entspricht "BinaryOperator.maxBy (Comparator.comsparingLong (X :: getTimestamp))", wobei "X" der Typ der Elemente ist, der prägnanter mit "import static" aussieht ... – Holger

+3

Die Alternative wäre 'groupingBy (X :: getUrl, collectingAndThen (maxBy (comparisonLong (X :: getTimestamp)), Optional :: get))' was eindeutig unter 'maxBy' leidet, was ein' Optional' erzeugt, obwohl wir wissen, dass Gruppen niemals leer sind ... – Holger

+0

danke Holger. Die arbeiten auch. –

Verwandte Themen