我有一个这样的功能:
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;
}
最佳答案
如果可以将StatUtils.mergeStats
重写为Collector
,则只需编写
return scopedMetrics.stream().collect(groupingBy(classifier, mergeStatsCollector));
即使您无法做到这一点,您也可以编写
return scopedMetrics.stream().collect(groupingBy(classifier,
collectingAndThen(toList(), StatUtils::mergeStats)));