使用Java 8流在地图中查找最小键

时间:2017-11-21 18:49:57

标签: java filtering java-stream

我试图在地图中找到最小键值。我在地图的值部分插入AtomicLong,初始化为系统时间,如下所示:

map.putIfAbsent(instr,new AtomicLong(System.currentTimeMillis())); 

然后在稍后阶段,我想知道最小值,这里的代码片段:

map.entrySet()
   .stream()
   .filter(key -> key.getKey().getSymbol() == this.symbol)
   .min(Map.Entry.comparingByValue())
   .get()
   .getKey()

我收到以下错误:

The method min(Comparator<? super Map.Entry<Instrument,AtomicLong>>) in the type
Stream<Map.Entry<Instrument,AtomicLong>> is not applicable for the arguments 
(Comparator<Map.Entry<Object,Comparable<? super Comparable<? super V>>>>)

由于线程安全问题,我将Map<K,V>中的V部分从Long更改为AtomicLong,因此工作正常。请告诉我如何使用stream实现此功能。提前谢谢!

3 个答案:

答案 0 :(得分:3)

Long与自身相当,因为它实现了Comparable<Long>

AtomicLong 与自身相比,因为它没有实现Comparable<AtomicLong>

这意味着您无法使用Comparable的{​​{3}}。

您可以尝试这样做:

.min(Map.Entry.comparingByValue(Comparator.comparingLong(AtomicL‌​ong::get)))

答案 1 :(得分:2)

你真的需要Map.Entry.comparingByValue()吗?

你可以“实施”你的(几乎:) :)自己的Comparator

.min( (x, y) -> Long.compare(x.getValue().get(), y.getValue().get()) )

答案 2 :(得分:0)

如错误所示:Comparator<Map.Entry<Object,Comparable<? super Comparable<? super V>>>>

Map.Entry.comparingByValue()要求他的值为Comparable的子类型并且:

  • Long实施Comparable<Long>
  • AtomicLong未实施Comparable<AtomicLong>

因此,您无法将Map.Entry.comparingByValue()用于sort()min()max() ......

您需要自己提供Comparator

  • .min(Comparator.comparingLong(lg -> lg.getValue().get()))最好的一个
  • .min((lg1, lg2) -> Long.compare(lg1.getValue().get(), lg2.getValue().get()))