как преобразовать ключи карты в верхний регистр при использовании потоков java 8?

#hashmap #java-8 #java-stream

#hashmap #java-8 #java-stream

Вопрос:

У меня есть метод, как показано ниже

 private Map<String,List<String>>  createTableColumnListMap(List<Map<String,String>> nqColumnMapList){

        Map<String, List<String>> targetTableColumnListMap = 
                nqColumnMapList.stream()
                     .flatMap(m -> m.entrySet().stream())
                     .collect(groupingBy(Map.Entry::getKey, mapping(Map.Entry::getValue, toList())));
        return targetTableColumnListMap;
    }
  

Я хочу ввести верхний регистр ключей карты, но не смог найти способ сделать это. есть ли способ java 8 для достижения этой цели?

Комментарии:

1. Заменить Map.Entry::getKey на e -> e.getKey().toUppercase() ?

Ответ №1:

Это не требует каких-либо сложных манипуляций с коллекторами. Допустим, у вас есть эта карта

 Map<String, Integer> imap = new HashMap<>();
imap.put("One", 1);
imap.put("Two", 2);
  

Просто получите поток для keySet() и соберите в новую карту, где ключи, которые вы вставляете, прописные:

 Map<String, Integer> newMap = imap.keySet().stream()
        .collect(Collectors.toMap(key -> key.toUpperCase(), key -> imap.get(key)));

// ONE - 1
// TWO - 2
  

Редактировать:

комментарий @ Holger верен, было бы лучше (и чище) просто использовать набор записей, так что вот обновленное решение

 Map<String, Integer> newMap = imap.entrySet().stream()
            .collect(Collectors.toMap(entry -> entry.getKey().toUpperCase(), entry -> entry.getValue()));
  

Комментарии:

1. Переопределение задачи, изменение ввода и вывода, чтобы прийти к выводу, что она может быть реализована проще, чем фактическая задача OP, не является реальным решением. Кроме того, потоковая передача через keySet может выглядеть проще, но выполнение поиска для каждого ключа является пустой тратой ресурсов по сравнению с потоковой передачей через entrySet() в первую очередь, которая предоставляет отображаемое значение бесплатно.

Ответ №2:

Ответ на ваш вопрос [который вы можете скопировать и вставить] :

 Map<String, List<String>> targetTableColumnListMap = nqColumnMapList.stream().flatMap(m -> m.entrySet().stream())
                .collect(Collectors.groupingBy(e -> e.getKey().toUpperCase(), Collectors.mapping(Map.Entry::getValue, Collectors.toList())));
  

Комментарии:

1. Будет лучше, если при голосовании против вам лучше дать какое-то объяснение. Простое молчаливое голосование не сделает вас более умным, вы все еще не умны, потому что проголосовали против, не посмотрев, что я хотел донести.

2. пожалуйста, укажите причину понижения, потому что это сработало для меня.

3. Моя интуиция подсказывает, что ответ, предоставленный @svarog, будет быстрее.