Java - составить карту - PullRequest
       9

Java - составить карту

15 голосов
/ 17 октября 2011

Как я могу разыграть Map<Object,Object> в Map<String,String> самым чистым способом?

Есть ли способ сделать это без итерации по карте?

Спасибо

Ответы [ 4 ]

11 голосов
/ 17 октября 2011

Фактический ответ:

Map<Object,Object> valueMap = ...;
@SuppressWarnings("unchecked")
Map<String,String> targetMap = (Map)valueMap;
9 голосов
/ 17 октября 2011

Я думаю, что это хорошая идея, чтобы объяснить, почему простое решение не работает и почему вы никогда, никогда не должны использовать это.

Предположим, вы можете привести List<Object> к List<String> (то же самое относится и к карте, просто более простой интерфейс). Что вы ожидаете от следующего кода:

List<Object> m = Something;
m.add("Looks good.");
m.add(42);
List<String> s = (List<String>)m; // uhuh, no we don't want that.
String myString = s.get(1); // huh exception here.

Теперь вы МОЖЕТЕ взломать его, используя решение Bohemians / Chris, но вы в основном разрушаете систему типов Java. НЕ ДЕЛАЙТЕ ЭТОГО. Вы не хотите, чтобы List<String> содержал целое число! Получите удовольствие от отладки, что позже - дополнительный код циклического перебора всех переменных позволит избежать многих головных болей и вряд ли является проблемой производительности.

Если есть причина объявить Карту как берущую Объект вместо Строки, кто-то может добавить к ней любой объект - обычно вы можете избежать этого с помощью лучшего общего вида.

1 голос
/ 17 октября 2011

Опираясь на Ответ Криса J , вот его "взломанный" код в действии, показывающий, как он работает:

public static void main(String[] args) {
    Map<Object, Object> valueMap = new HashMap<Object, Object>();
    valueMap.put("foo", "bar");
    @SuppressWarnings("unchecked")
    Map<String, String> targetMap = (Map<String, String>) ((Object) valueMap); // hack alert!
    for (Map.Entry<String, String> entry : targetMap.entrySet()) {
        String key = entry.getKey();
        String value = entry.getValue();
        System.out.println(key + "=" + value); // prints foo=bar :)
    }
}

Ух ты!Без исключений времени выполнения:)

0 голосов
/ 20 марта 2019

Если вы хотите что-то чистое, вы должны конвертировать "глубоко"! ключи и значения.

Используя поток Java 8, это займет всего несколько строк:

static public Map<String, String> toStringString(Map<? extends Object, ? extends Object> map) {
        return map
                .entrySet()
                .stream()
                .collect(Collectors.toMap(
                    e -> e.getKey().toString(),
                    e -> e.getValue().toString()
                ));
    }
...