J'ai une carte:
Map<String, String> utilMap = new HashMap();
utilMap.put("1","1");
utilMap.put("2","2");
utilMap.put("3","3");
utilMap.put("4","4");
Je l'ai converti en chaîne:
String utilMapString = utilMap
.entrySet()
.stream()
.map(e -> e.toString()).collect(Collectors.joining(","));
Out put: 1=1,2=2,3=3,4=4,5=5
Comment convertir utilMapString en carte en Java8? Qui peut m'aider avec?
Fractionnez la chaîne par ,
pour obtenir des entrées de carte individuelles. Puis divisez-les par =
pour obtenir la clé et la valeur.
Map<String, String> reconstructedUtilMap = Arrays.stream(utilMapString.split(","))
.map(s -> s.split("="))
.collect(Collectors.toMap(s -> s[0], s -> s[1]));
_ {Note: Comme l'a souligné Andreas @ dans les commentaires , ce n'est pas un moyen fiable de convertir une carte en une chaîne.
EDIT: Merci à Holger pour cette suggestion.
Utilisez s.split("=", 2)
pour vous assurer que le tableau n'est jamais plus grand que deux éléments. Cela sera utile pour ne pas perdre le contenu (lorsque la valeur a =
)
Exemple: lorsque la chaîne d'entrée est "a=1,b=2,c=3=44=5555"
vous obtiendrez {a=1, b=2, c=3=44=5555}
Plus tôt (en utilisant simplement s.split("=")
) donnera {a=1, b=2, c=3}
Voici une autre option permettant de diffuser une liste de termes 1=1
etc. sur une carte.
String input = "1=1,2=2,3=3,4=4,5=5";
Map<String, String> map = Arrays.asList(input.split(",")).stream().collect(
Collectors.toMap(x -> x.replaceAll("=\\d+$", ""),
x -> x.replaceAll("^\\d+=", "")));
System.out.println(Collections.singletonList(map));
[{1=1, 2=2, 3=3, 4=4, 5=5}]
Si vous souhaitez générer une carte à partir de String, vous pouvez utiliser le moyen ci-dessous:
Map<String, String> newMap = Stream.of(utilMapString.split("\\,"))
.collect(Collectors.toMap(t -> t.toString().split("=")[0], t -> t.toString().split("=")[1]));
Si la séquence peut contenir des valeurs avec la même clé, utilisez
Map<String, String> skipDuplicatesMap = Stream.of("1=1,2=2,3=3,4=4,5=5".split(",")).
map(el -> el.split("=")).
collect(toMap(arr -> arr[0], arr -> arr[1], (oldValue, newValue) -> oldValue));