使用lambdas从Map返回前n个元素

use*_*187 5 java lambda java-8

我有一个有序的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)));
}
Run Code Online (Sandbox Code Playgroud)

Stu*_*rks 4

看起来您至少已经解决了一些问题。不过,我建议进行一些改进。

您可能希望参数类型是这样SortedMap,这样您就不会意外地传递诸如HashMap没有定义顺序的普通内容之类的内容。SortedMap您可能还希望返回类型为 a 。要实现此功能,您必须使用 的四参数重载Collectors.toMap,其第四个参数是一个供应商,可让您控制地图的构造。如果你不这样做,你会得到一个普通的HashMap.

第三个参数是合并函数,当合并同一键的多个值时调用该函数。您知道这些键是唯一的,因为您首先是从地图中获取它们的,所以我们不必担心这一点。我刚刚让它返回第一个值,但你也可以让它抛出异常或其他东西。

最后,您不需要预先检查大小,因为如果大于通过的条目数,则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));
}
Run Code Online (Sandbox Code Playgroud)