Convertir Java Map en clé personnalisée = chaîne de valeur

J’ai TreeMap que je dois convertir en chaîne de type URI, puis revenir à Map. J’ai besoin de définir des délimiteurs personnalisés.

Y a-t-il un outil (goyave, Apache commons?) Qui peut le faire pour moi? Je sais, je peux écrire des boucles simples, mais je cherche un one-liner 🙂

Par exemple

 key value key1 val1 key2 val2 key1_val1|key2_val2 

Selon David Tulig, vous pouvez le faire en goyave via

  Ssortingng ssortingng = Joiner.on("|").withKeyValueSeparator("_").join(map); 

Le contraire est également disponible via

  Map map = Splitter.on("|").withKeyValueSeparator("_").split(ssortingng); 

ce n’est pas une goyave ni des communes apache, et c’est une boucle, mais à part l’instanciation du constructeur de cordes, il s’agit d’une ligne:

 for (Entry entry : myMap.entrySet()) { sb.append(entry.getKey() + separator + entry.getValue() + "\n"); } 

Utilisation de Java8:

 private static Map prepareMap() { Map map = new LinkedHashMap<>(); map.put("key1", "val1"); map.put("key2", "val2"); return map; } @Test public void toStr() { assertEquals("key1_val1|key2_val2", prepareMap().entrySet().stream() .map(e -> e.getKey() + "_" + e.getValue()) .collect(Collectors.joining("|"))); } @Test public void toStrFunction() { assertEquals("key1_val1|key2_val2", joiner("|", "_").apply(prepareMap())); } private static Function, Ssortingng> joiner(Ssortingng entrySeparator, Ssortingng valueSeparator) { return m -> m.entrySet().stream() .map(e -> e.getKey() + valueSeparator + e.getValue()) .collect(Collectors.joining(entrySeparator)); } @Test public void toMap() { assertEquals("{key1=val1, key2=val2}", Stream.of("key1_val1|key2_val2".split("\\|")) .map(e -> e.split("_", 2)) .collect(Collectors.toMap(e -> e[0], e -> e.length > 1 ? e[1] : null)).toSsortingng()); } @Test public void toMapFunction() { assertEquals("{key1=val1, key2=val2}", splitter("\\|", "_").apply("key1_val1|key2_val2").toSsortingng()); } private static Function> splitter(Ssortingng entrySeparator, Ssortingng valueSeparator) { return s -> Stream.of(s.split(entrySeparator)) .map(e -> e.split(valueSeparator, 2)) .collect(Collectors.toMap(e -> e[0], e -> e.length > 1 ? e[1] : null)); } 

En Java 8 et supérieur, il existe un autre moyen de ne pas avoir de dépendances externes: utilisez SsortingngJoiner :

  List cities = Arrays.asList("Milan", "London", "New York", "San Francisco"); Ssortingng citiesCommaSeparated = Ssortingng.join(",", cities); System.out.println(citiesCommaSeparated); //Output: Milan,London,New York,San Francisco 

Les crédits et les exemples vont à cette URL (https://reversecoding.net/java-8-convert-list-ssortingng-comma/)