2014-04-24 3 views
3

У меня есть отсортированная Карта и вы хотите вернуть первые n элементов.Возврат первых n элементов с карты с использованием lambdas

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

это не работает, компилятор означает Map.Entry :: getKey, Map.Entry :: getValue имеет циклический вывод – user3411187

+0

Решенный .. Мне просто нужно было добавить общие типы public static Карта getFirstEntries (окончательная карта .. – user3411187

ответ

4

Похоже, вы решили хотя бы часть вашей проблемы. Однако я бы предложил несколько уточнений.

Возможно, вы хотите, чтобы тип параметра был SortedMap, поэтому вы случайно не проходите мимо чего-то вроде простого HashMap, для которого нет определенного порядка. Возможно, вам понадобится тип возврата SortedMap. Чтобы выполнить эту работу, вы должны использовать перегрузку с четырьмя аргументами Collectors.toMap, чей четвертый аргумент является поставщиком, который позволяет вам управлять построением карты. Если вы этого не сделали, вы получите простой 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)); 
} 
Смежные вопросы