Java获取用于映射到另一个流的流的值

时间:2016-01-25 12:47:08

标签: java functional-programming hashmap java-stream

我使用以下代码为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;

1 个答案:

答案 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在大多数操作中产生副作用(peekforEachforEachOrdered除外)。例如,在代码mapToInt中,使用有状态lambda调用方法,而文档explicitly says则传递函数必须是无状态的。