我是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....
答案 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
中有一个接受name
,count
和pct
的构造函数。