我有这样的功能:
private static Map<String, ResponseTimeStats> perOperationStats(List<PassedMetricData> scopedMetrics, Function<PassedMetricData, String> classifier)
{
Map<String, List<PassedMetricData>> operationToDataMap = scopedMetrics.stream()
.collect(groupingBy(classifier));
return operationToDataMap.entrySet().stream()
.collect(toMap(Map.Entry::getKey, e -> StatUtils.mergeStats(e.getValue())));
}有没有办法让groupBy调用执行我在第2行中显式执行的转换,这样就不必在地图上单独进行流了?
更新
下面是mergeStats()的样子:
public static ResponseTimeStats mergeStats(Collection<PassedMetricData> metricDataList)
{
ResponseTimeStats stats = new ResponseTimeStats();
metricDataList.forEach(data -> stats.merge(data.stats));
return stats;
}发布于 2014-08-06 17:31:33
如果可以将StatUtils.mergeStats重写为Collector,则只需编写
return scopedMetrics.stream().collect(groupingBy(classifier, mergeStatsCollector));即使你做不到,你也可以写
return scopedMetrics.stream().collect(groupingBy(classifier,
collectingAndThen(toList(), StatUtils::mergeStats)));发布于 2014-08-06 17:27:07
为了对PassedMetricData实例进行分组,您必须使用整个流,因为例如,第一个和最后一个PassedMetricData可能被分组到同一个组中。
这就是为什么分组必须是原始流上的终端操作,并且您必须创建一个新的Stream才能对这个分组的结果进行转换。
您可以将这两条语句链接起来,但这不会有太大区别:
private static Map<String, ResponseTimeStats> perOperationStats(List<PassedMetricData> scopedMetrics, Function<PassedMetricData, String> classifier)
{
return scopedMetrics.stream()
.collect(groupingBy(classifier)).entrySet().stream()
.collect(toMap(Map.Entry::getKey, e -> StatUtils.mergeStats(e.getValue())));
}https://stackoverflow.com/questions/25166337
复制相似问题