根据对象的参数和值将Map<T, Value>转换为List<T>

问题描述 投票:0回答:1

我有一张地图

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 下限: 指标结果,时间戳>)

java hashmap java-stream groupingby
1个回答
3
投票

小修改:

  1. 更改
    MetricResult::getEndTime
    以从条目中获取 endTime
    ent -> ent.getKey().getEndTime()
  2. 使用
    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();
© www.soinside.com 2019 - 2024. All rights reserved.