有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java使用lambdas从映射返回前n个元素

我有一个已排序的映射,希望返回前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) 个答案

  1. # 1 楼答案

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

    您可能希望参数类型为SortedMap,这样就不会意外地传入没有定义顺序的普通HashMap。您可能还希望返回类型为SortedMap。为了实现这一点,您必须使用Collectors.toMap的四个arg重载,它的第四个arg是一个供应商,可以让您控制地图的构造。如果你不这么做,你会得到一个普通的HashMap

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

    最后,您不需要预先检查大小,因为如果n大于通过的条目数,那么limit(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));
    }