我使用以下代码为HashMap创建条目,并搜索存储的最大值。以下剪辑工作::
//key value
LongStream.rangeClosed( 2 , 1_000_000 ).mapToInt( i -> hm.createAndGet( i) ).max().getAsInt();
如何更改它以返回与最大值相关的键?换句话说,如何使用流编写此循环?
//creates entries and searches for the maximum value stored in hm, and returns the key assosiated with the highest value
int maxValue = -1;
long maxKey = -1;
for(long currentKey = maxNum; currentKey > 0; currentKey --)
{
int currentValue = hm.createAndGet( currentKey );
if( maxValue < currentValue )
{
maxKey = currentKey ;
maxStart = currStart;
}
}
return maxKey;
答案 0 :(得分:0)
您可以使用max(Comparator)
:
long maxKey = LongStream.rangeClosed( 2 , 1_000_000 )
.boxed()
.max(Comparator.comparingInt( i -> hm.createAndGet( i ) ) )
.get();
然而,并不能保证createAndGet
仅为每个提供的密钥调用一次(实际上,对于大多数密钥,它将被调用两次)。
替代解决方案是引入像这样的对流:
long maxKey = LongStream.rangeClosed(2, 1_000_000)
.mapToObj(i -> new AbstractMap.SimpleEntry<>(i, hm.createAndGet( i )))
.max(Map.Entry.comparingByValue())
.get().getKey();
一般情况下,不应使用Stream API在大多数操作中产生副作用(peek
,forEach
和forEachOrdered
除外)。例如,在代码mapToInt
中,使用有状态lambda调用方法,而文档explicitly says则传递函数必须是无状态的。