将数据流转换为一组对象

时间:2016-04-21 17:55:12

标签: java java-8

我是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
}

我不确定是否应该使用reduce或collect以及它的外观。

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

1 个答案:

答案 0 :(得分:1)

假设getName()课程中有RequestObject方法,您可以使用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的构造函数。