我有一个有序的Map,想要返回前n个元素。
public static Map getFirstEntries(final Map sortedMap, int elementsToReturn) {
elementsToReturn = (sortedMap.size() > elementsToReturn)
? elementsToReturn
: sortedMap.size();
return sortedMap.entrySet()
.stream()
.limit(elementsToReturn)
.collect(Collectors.toMap(Map.Entry::getKey,Map.Entry::getValue)));
}
答案 0 :(得分:4)
看起来你已经解决了至少一些问题。不过,我建议进行一些改进。
您可能希望参数类型为SortedMap
,因此您不会意外地传递没有定义顺序的普通HashMap
。您可能希望返回类型也是SortedMap
。为了使这项工作,你必须使用Collectors.toMap
的四个arg重载,其第四个arg是一个供应商,可以让你控制地图的构造。如果你没有这样做,你就会得到一个简单的HashMap
。
第三个arg是合并函数,当合并同一个键的多个值时调用该函数。您知道密钥是唯一的,因为您首先将它们从地图中取出,因此我们不必担心这一点。我只是让它返回第一个值,但你也可以让它抛出异常或其他东西。
最后,您不需要预先检查尺寸,因为如果limit(n)
大于通过的条目数,n
将正常工作。
修订后的代码如下:
public static <K,V> SortedMap<K,V> getFirstEntries(SortedMap<K,V> sortedMap, int elementsToReturn) {
return sortedMap.entrySet()
.stream()
.limit(elementsToReturn)
.collect(toMap(Map.Entry::getKey, Map.Entry::getValue,
(v1,v2) -> v1, TreeMap::new));
}