我有一个这样的功能:

 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)));

07-24 09:19