2016-04-21 63 views
0

的我是新來的Java 8流,並有一個問題 我有最多的製造數據流這樣轉換數據流的一組對象

RequestObject { 
    String Name; 
    Long timestamp; 
    Set<String> data; 
} 

我要流這個數據並對其進行處理並計算名稱以及它出現的時間。

我的最終目標是

ProcessedData { 
    String name; //request object name 
    float pct; //percentage of times it appears in all the stream 
    int count; count of times it appears 
} 

我不知道我是否應該用減少或收集以及如何可能的樣子。

Set<ProcessedData> result = sourceData.stream().collect/reduce.... 
+0

你如何計算pct?你能舉一個簡單的輸入/輸出例子嗎? – assylias

+0

totalOfName/totalOfAllNames。在java前8我會做這樣的事情。假設我正在處理的數據位於地圖中如果數據產生了一個地圖對於(字符串名稱:結果數據.getKeySet()){計數=結果數據.get(名稱);總計+ =計數;}然後做pct鈣或類似的東西 – user1864350

回答

1

假設有一個在你的RequestObjectgetName()方法,你可以用Collectors.groupingBy()Collectors.counting()做如下:

Map<String, Long> map = sourceData.stream() 
    .collect(Collectors.groupingBy(
     RequestObject::getName, 
     Collectors.counting())); 

在該地圖上,你有你需要的所有信息。要獲得給定名稱的%,只需執行(float) byName.get("GIVEN_NAME") * 100.0/(float) sourceData.size()即可。爲每名做,迭代地圖,爲每個條目創建ProcessedData的一個實例:

Set<ProcessedData> processedData = map.entrySet().stream() 
    .map(e -> new ProcessedData(
     entry.getKey(), 
     entry.getValue(), 
     (float) entry.getValue() * 100.0/(float) sourceData.size())) 
    .collect(Collectors.toSet()); 

這裏假設你有ProcessedData接受namecountpct構造。

+1

謝謝,這很好,我認爲我的問題的一部分是,我試圖一次做到這一切。 – user1864350

+0

@ user1864350如果你只想做一個相同的過程,你需要編寫你自己的收集器。這會增加解決方案的複雜性。如果你買不起兩張票,也許值得有一個更復雜的解決方案。 –

+0

謝謝,我在想這件事情,並假設我必須爲我自己的收藏家 – user1864350