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

时间:2014-04-24 07:30:37

标签: 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)));
}

1 个答案:

答案 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));
}