Пераўтварыць Map <String, Object> да карце <String, String>

How can I convert Map to Map ?

Гэта не працуе:

Map map = new HashMap(); //Object is containing String
Map newMap =new HashMap(map);
39
Ці з'яўляецца аб'ект, які вы перадаеце гэта радок?
дададзена аўтар Shreyos Adikari, крыніца
Што вы чакаеце/хочаце, каб адбылося ў гэтым выпадку: карта = новы Map () map.put ( "ключ", новы Integer (42)) `Карта;`
дададзена аўтар Shreyos Adikari, крыніца
Итерируем map1 (карта) у бок ітэрацыі вымаўлення аб'екта ў радок і стварыць newMap з oldString і зноў адліваюць Радок
дададзена аўтар Sanath, крыніца
Што вы спрабуеце зрабіць?
дададзена аўтар lc2817, крыніца
Бо не кожны Object гэта Радок , вы можаце выклікаць ToString() на кожным значэнні Карта . Але гэта тое, што вы боб на «канвертаваць»?
дададзена аўтар user1907906, крыніца

10 адказы

Цяпер, калі ў нас ёсць Java-8/патокаў, мы можам дадаць яшчэ адзін магчымы адказ на спіс:

Мяркуючы, што кожнае з значэнняў фактычна з'яўляюцца Радок , а прывядзенне да Радок павінен быць бяспечным. У адваротным выпадку можа быць выкарыстаны нейкі іншы механізм для картаграфавання аб'ектаў у радкі.

Map map = new HashMap<>();
Map newMap = map.entrySet().stream()
     .collect(Collectors.toMap(Map.Entry::getKey, e -> (String)e.getValue()));
25
дададзена
З некаторай дадатковай дапамогі :. Карта newMap = map.entrySet() патоку() .filter (уваход -> entry.getValue() InstanceOf String) .collect (Collectors.toMap (Map.Entry :: GETKEY, е -> (String) e.getValue ()));
дададзена аўтар Balázs Mária Né, крыніца
чаму не e.getValue (). ToString() чаму відавочнае прывядзенне?
дададзена аўтар Anton Balaniuc, крыніца
@AntonBalaniuc мы мяркуем, што OP <�я> ведае , што значэння ўсіх радкоў так што тут мы выкарыстоўваем больш строгі кідок замест прымушаць радковае значэнне з аб'екта. Вядома, як ужо гаварылася ў адказе, калі ёсць нейкі іншы механізм больш прыдатным для стварэння радкі з значэнняў аб'ектаў, якія павінны быць выкарыстаны замест кідка.
дададзена аўтар skeryl, крыніца

Калі вашага Аб'екты з'яўляюцца змяшчаюць у Радок толькі, то вы можаце зрабіць гэта наступным чынам:

Map map = new HashMap(); //Object is containing String
Map newMap =new HashMap();
for (Map.Entry entry : map.entrySet()) {
       if(entry.getValue() instanceof String){
            newMap.put(entry.getKey(), (String) entry.getValue());
          }
 }

Калі кожны Аб'екты не Радок , то вы можаце замяніць (String) entry.getValue() у entry.getValue (). ToString() .

20
дададзена
Ўніз выбаршчык не маглі б вы пракаментаваць гэтую?
дададзена аўтар Shreyos Adikari, крыніца
Калі ласка, праверце мае словы ў адказ.
дададзена аўтар Shreyos Adikari, крыніца
Гатова .. Калі ласка, наведайце адзін раз.
дададзена аўтар Shreyos Adikari, крыніца
Я зрабіў. Што ты прапануеш вышэй, што за выключэннем лоўлі з'яўляецца дрэннай практыкай. Калі вы ведаеце, што ўсе аб'екты з'яўляюцца радкі, вам не трэба, каб злавіць што-небудзь, ці не так? Калі вы не ўпэўненыя, што вам трэба праверыць, ці не злавіць!
дададзена аўтар Balázs Mária Né, крыніца
Добра, адкліканая downvote.
дададзена аўтар Balázs Mária Né, крыніца
Так, не дазваляйце ClassCastException быць выкінуты, а не выконваць праверку перад тым, калі значэнне гэта Радок .
дададзена аўтар Balázs Mária Né, крыніца
Лепш String.valueOf , каб прадухіліць NullPointerException
дададзена аўтар Patrick Parker, крыніца

Generic types is a compile time abstraction. At runtime all maps will have the same type Map. So if you are sure that values are strings, you can cheat on java compiler:

Map m1 = new HashMap();
Map m2 = (Map) m1;

Капіяванне ключоў і значэнняў з адной калекцыі ў іншую з'яўляецца залішнім. Але гэты падыход ўсё яшчэ не вельмі добра, таму што гэта парушае бяспеку тыпаў джынэрыкі. Можа быць, вы павінны перагледзець свой код, каб пазбегнуць такіх рэчаў.

14
дададзена

Ёсць два спосабу зрабіць гэта. Адным з іх з'яўляецца вельмі просты, але небяспечна:

Map map = new HashMap();
Map newMap = new HashMap((Map)map); //unchecked warning

The other way has no compiler warnings and ensures type safety at runtime, which is more robust. (After all, you can't guarantee the original map contains only String values, otherwise why wouldn't it be Map in the first place?)

Map map = new HashMap();
Map newMap = new HashMap();
@SuppressWarnings("unchecked") Map intermediate =
    (Map)Collections.checkedMap(newMap, String.class, String.class);
intermediate.putAll(map);
5
дададзена

Як вы ліццё з аб'екта ў радок я рэкамендую вам злавіць і справаздачу (у пэўным сэнсе, тут я проста надрукаваць паведамленне, якое звычайна дрэнна) выключэнне.

    Map map = new HashMap(); //Object is containing String
    Map newMap =new HashMap();

    for (Map.Entry entry : map.entrySet()) {
        try{
            newMap.put(entry.getKey(), (String) entry.getValue());
        }
        catch(ClassCastException e){
            System.out.println("ERROR: "+entry.getKey()+" -> "+entry.getValue()+
                               " not added, as "+entry.getValue()+" is not a String");
        }
    }
2
дададзена

<�Моцны> Ці не магчыма.

Гэта крыху нелагічным.

<�Р> Вы сутыкнуліся «Яблык з'яўляецца-фрукт», але «Кожны Плод ня Apple,»

Перайсці да стварэння новай карты і праверцы з асобнік з радком

1
дададзена

Ніжэй будзе пераўтварыць існуючыя запісы.

TransformedMap.decorateTransform(params, keyTransformer, valueTransformer)

Дзе, як

MapUtils.transformedMap(java.util.Map map, keyTransformer, valueTransformer)

толькі трансфармуе новыя запісы ў карту

1
дададзена
TransformedMap і MapUtils ў Apache Common Collections commons.apache.org/proper/commons-collections
дададзена аўтар arulraj.net, крыніца

У той час як вы можаце зрабіць гэта з дапамогай грубай адліўкі і падушаных папярэджанняў

Map map = new HashMap();
// Two casts in a row.  Note no "new"!
@SuppressWarnings("unchecked")
Map newMap = (HashMap)(Map)map;  

што на самой справе адсутнічае ўвесь сэнс. :)

<�Моцны> Спроба пераўтварыць вузкі агульны тып для больш шырокага агульнага тыпу азначае, што вы карыстаецеся няправільны тып у першую чаргу.

У якасці аналогіі: уявіце сабе, у вас ёсць праграма, якая робіць volumous апрацоўкі тэксту. Уявіце, што вы робіце першую палову апрацоўкі з выкарыстаннем кода <> аб'ектаў (!!), а затым вырашыць, каб зрабіць другую палову з правільнай тыпізацыі як Радок , так што вы вузкі адліваная ад Object на Радок . На шчасце, вы можаце зрабіць гэта Java (лёгка ў дадзеным выпадку) - але гэта проста маскіроўка той факт, што вы з дапамогай слабой тыпізацыі ў першай палове. Дрэнны практык, не аргумент.

Няма розніцы тут (толькі цяжэй, каб кінуць). Вы заўсёды павінны выкарыстоўваць строгую тыпізацыі. Пры мінімальным выкарыстанні якога-небудзь тыпу базы - то можна выкарыстоўваць джынэрыкі маскі ( «? Пашырае BaseType» або «супер BaseType?»), Каб даць тып-сумяшчальнасць і аўтаматычнае ліццё. Яшчэ лепш, калі выкарыстоўваць правільны вядомы тып. Ніколі не выкарыстоўвайце аб'ект, калі ў вас няма 100% абагульнены код, які на самай справе можа быць выкарыстаны з любым тыпам.

Надзея, што дапамагае! :) :)


Note: The generic strong typing and type-casting will only exist in .java code. After compilation to .class we are left with raw types (Map and HashMap) with no generic type parameters plus automatic type casting of keys and values. But it greatly helps because the .java code itself is strongly-typed and concise.

1
дададзена

Вялікія рашэнні тут, проста яшчэ адзін варыянт, які, прымаючы пад увагу абыходжанне з NULL значэння:

Map map = new HashMap<>();

Map stringifiedMap = map.entrySet().stream()
             .filter(m -> m.getKey() != null && m.getValue() !=null)
             .collect(Collectors.toMap(Map.Entry::getKey, e -> (String)e.getValue()));
0
дададзена
private Map convertAttributes(final Map attributes) {
    final Map result = new HashMap();
    for (final Map.Entry entry : attributes.entrySet()) {
        result.put(entry.getKey(), String.valueOf(entry.getValue()));
    }
    return result;
}
0
дададзена
Пры даданні код упэўнены Ці вырашыць гэтую праблему, было б выдатна, каб дадаць некаторыя тлумачэнні да коду, так і будучым наведвальнікам людзей новых да мовы можна зразумець і атрымаць з яго лепш. і Сардэчна запрашаем на Stack Overflow!
дададзена аўтар DeadChex, крыніца