我试图在地图中找到最小键值。我在地图的值部分插入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实现此功能。提前谢谢!
答案 0 :(得分:3)
Long
与自身相当,因为它实现了Comparable<Long>
。
AtomicLong
不与自身相比,因为它没有实现Comparable<AtomicLong>
。
这意味着您无法使用Comparable
的{{3}}。
您可以尝试这样做:
.min(Map.Entry.comparingByValue(Comparator.comparingLong(AtomicLong::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()))