2016-10-19 14 views
1

有誰知道如何簡潔地編寫一個java 8類型的獨特函數來通過用戶點擊列表進行流式處理,並使不同(基於url),但保留具有較晚時間戳的函數?Java 8.對象列表。想要根據規則保留區分屬性

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 

最終的結果應該是

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 

回答

3

一個想法是列表的內容收集到的地圖,其中每個元素的關鍵是URL,價值用戶的點擊元並用於解決衝突的意願函數保留最高時間戳輸入:

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

從那裏,你可以把這個地圖,這將給你t的集合值他爲每個不同的網址提供最新點擊。

+3

合併函數相當於'BinaryOperator.maxBy(Comparator.comparingLong(X :: getTimestamp))',其中'X'是項目的類型,與'import static'相比更加簡潔... – Holger

+3

替代方案將'groupingBy(X :: getUrl,collectAndThen(maxBy(comparatorLong(X :: getTimestamp)),Optional :: get))'顯然遭受'maxBy'產生'Optional',儘管我們知道組永遠不會是空的... – Holger

+0

感謝Holger。那些工作也是。 –

相關問題