Замените ключи HashMap значениями в файле свойств в Java - PullRequest
0 голосов
/ 22 ноября 2018

Я должен заменить ключи HashMap на основе сопоставления файлов свойств на сопоставление старых - новых ключей.Является ли приведенный ниже подход наилучшим способом замены ключей?

KeyMapping.properties

newKey1 oldLKey1
newKey2 oldKey2


//Load property mapping file
ResourceBundle properties = ResourceBundle.getBundle("KeyMapping");

Enumeration<String> newKeys = properties.getKeys();
        Map<String, Object> result = new LinkedHashMap<>();

  while (newKeys.hasMoreElements()) {
    String newKey = (String) newKeys.nextElement();
    Iterator<Entry<String, Object>> iterator = mapToReplaceKeys.entrySet().iterator();

    while(iterator.hasNext()) {
       Entry<String, Object> entry = iterator.next();

      //If key matches the key in property file       
      if (entry.getKey().equals(newKey)) {

      //remove the entry from map mapToReplaceKeys
      iterator.remove();

      //add the key with the 'oldKey' and existing value
      result.put(properties.getString(newKey), entry.getValue());            
    }
  }
}

Ответы [ 2 ]

0 голосов
/ 22 ноября 2018

Не итерируйте по Map, просто чтобы проверить ключи на равенство.Вот для чего предназначены Map специальные методы поиска:

ResourceBundle properties = ResourceBundle.getBundle("KeyMapping");
Map<String, Object> result = new LinkedHashMap<>();

for(String newKey: properties.keySet()) {
    Object value = mapToReplaceKeys.remove(newKey);
    if(value != null) result.put(properties.getString(newKey), value);
}

Поскольку вы хотите удалить сопоставления, вы можете просто использовать remove на Map, что ничего не будет делать и простовернуть null, если ключа нет.

0 голосов
/ 22 ноября 2018

То, что вы по существу делаете, это:

Map<String, Object> result = Collections.list(properties.getKeys())
                .stream()
                .flatMap(element -> mapToReplaceKeys.entrySet()
                        .stream()
                        .filter(entry -> entry.getKey().equals(element)))
                .collect(toMap(e -> properties.getString(e.getKey()),
                        Map.Entry::getValue,
                        (l, r) -> r,
                        LinkedHashMap::new));

или вы также можете сделать:

Map<String, Object> result = new LinkedHashMap<>();
newKeys.asIterator()
       .forEachRemaining(e -> mapToReplaceKeys.forEach((k, v) -> {
             if(k.equals(e)) result.put(properties.getString(k), v);
       }));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...