我有一张 map Map<MetricResult, Long> metricResultToComputationTime

MetricResult具有方法MetricResult::getEndTime.

我想得到一个List<MetricResult>,其中每个MetricResult都有一个唯一的结束时间.如果结束时间匹配,我希望使用 map 中计算时间更长的那个.我该怎么做得干净利落?

我知道有一些简单而冗长的方法可以做到这一点,但我想找一种优雅的方式.

我试过这样的东西:

List<MetricResult> metricResults =
    metricResultToComputationTime.entrySet().stream()
        .collect(
            groupingBy(
                MetricResult::getEndTime,
                collectingAndThen(maxBy(Map.Entry.comparingByValue()), Optional::get)))
        .values();

但它不能编译

错误:

没有找到合适的方法, collect(java. util. stream. Collector MetricResults java. util. Map. Entry java. lang. Object,V,capture#1<&<> 的?,java.util.Map Timestamp,java.lang. Object)方法<>> java. util. stream. Stream. collect(java. util. function. Supplier,java. util. function. BiConsumer R,?< 超级 java.util.Map. Entry MetricResults,Timestamp,java.util.function. BiConsumer R,R)<>><> 不适用(推理变量T具有不相容的上限 bounds:MetricContact,java. util. Map. Entry K,V,T,T下界:<> MetricReport,时间戳)>

推荐答案

小修改:

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

Java相关问答推荐

如何使用解析器组合子解析Java数组类型签名?

Junit with Mockito for java

JVM会优化这个数学运算吗?

我找不到&Quot;配置&的位置

为什么我的在一个范围内寻找素数的程序不能像S所期望的那样工作

如何让JavaFx应用程序识别依赖项?

有没有更快的方法在N个容器中删除重复项?

使用用户引入的参数生成人员数组

为什么我的回收视图会显示重复的列表?

try 使用类来包含JSON响应

Java创建带有扩展通配符的抽象处理器

如何使这两种方法合二为一?

从12小时开始的日期模式

IntelliJ IDEA中的JavaFX应用程序无法在资源中找到CSS文件

Oracle中从JSON中提取和插入数据

接受类及其接口的Java类型(矛盾)

在具有Quarkus Panache的PostgreSQL中将JSON数据存储为JSONB时,会将其存储为转义字符串

如何使用jOOQ在PostgreSQL中从枚举类型生成Java枚举

由于可为null,无法在kotlin中实现java接口

";重复键的值提示唯一约束«;livre_genre_pkey»";例外