Eu tenho um mapa Map<MetricResult, Long> metricResultToComputationTime
.
MetricResult
tem um método MetricResult::getEndTime
.
Quero chegar a um List<MetricResult>
local onde cada um MetricResult
tenha um horário de término único. Se os horários finais corresponderem, quero usar aquele com maior tempo de computação do mapa. Como faço isso de maneira organizada?
Eu sei que existem maneiras simples e prolixas de fazer isso, mas estou procurando algo elegante.
Eu tentei algumas coisas assim:
List<MetricResult> metricResults =
metricResultToComputationTime.entrySet().stream()
.collect(
groupingBy(
MetricResult::getEndTime,
collectingAndThen(maxBy(Map.Entry.comparingByValue()), Optional::get)))
.values();
Mas não compila
Erro:
nenhum método adequado encontrado para collect(java.util.stream.Collector<MetricResult&java.util.Map.Entry<java.lang.Object,V>,capture#1 of ?,java.util.Map<Timestamp,java.lang. Objeto >>) método java.util.stream.Stream.collect(java.util.function.Supplier,java.util.function.BiConsumer<R,? super java.util.Map.Entry<MetricResult,Timestamp>>,java .util.function.BiConsumer<R,R>) não é aplicável (a variável de inferência T tem limites superiores incompatíveis: MetricResult,java.util.Map.Entry<K,V>,T,T limites inferiores: MetricResult,Timestamp> )