2016-10-19 10 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)); 

はそこから、あなたはあなたのトンのコレクションを提供します。このマップの値をとることができますし、衝突の意志を解決するために使用される機能は、最高のタイムスタンプを持つ入力を保持します彼はそれぞれの異なるURLの最新のクリックをします。

+3

マージ関数は 'BinaryOperator.maxBy(Comparator.comparingLong(X :: getTimestamp))'と同等です。 'X'はアイテムの型で、' import static'でより簡潔になります... – Holger

+3

代替グループが空ではないことが分かっているにもかかわらず、 'maxBy'が明らかに' Optional'を生成してしまう 'groupingBy(X :: getUrl、collectingAndThen(maxBy(comparisonLong(X :: getTimestamp))、Optional :: get))) ... – Holger

+0

Holgerに感謝します。それらも働く。 –

関連する問題