2016-04-21 62 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