我有一张地图
Map<MetricResult, Long> metricResultToComputationTime
。
MetricResult
有一个方法MetricResult::getEndTime
。
我想得到一个
List<MetricResult>
,其中每个 MetricResult
都有唯一的结束时间。如果结束时间匹配,我想使用地图中计算时间较长的那个。我该如何巧妙地做到这一点?
我知道有一些简单而冗长的方法可以做到这一点,但我正在寻找一些优雅的方法。
我尝试了一些这样的东西:
List<MetricResult> metricResults =
metricResultToComputationTime.entrySet().stream()
.collect(
groupingBy(
MetricResult::getEndTime,
collectingAndThen(maxBy(Map.Entry.comparingByValue()), Optional::get)))
.values();
但是无法编译
错误:
没有找到合适的方法 收集(java.util.stream.Collector
,捕获#1 ?,java.util.Map >) 方法 java.util.stream.Stream.collect(java.util.function.Supplier,java.util.function.BiConsumer >,java.util.function.BiConsumer ) 不适用(推理变量 T 具有不兼容的上限 边界:MetricResult,java.util.Map.Entry ,T,T 下限: 指标结果,时间戳>)
小修改:
MetricResult::getEndTime
以从条目中获取 endTime:ent -> ent.getKey().getEndTime()
。values().stream().map(Map.Entry::getKey).toList()
将分组的条目结果映射到列表。List<MetricResult> metricResults =
metricResultToComputationTime.entrySet().stream()
.collect(groupingBy(
ent -> ent.getKey().getEndTime(),
collectingAndThen(maxBy(Map.Entry.comparingByValue()), Optional::get)))
.values().stream()
.map(Map.Entry::getKey).toList();