Mapear para conversão de string em Java

Mapear para conversão de string em Java

1. Visão geral

Neste tutorial, vamos nos concentrar na conversão deMap emStringe vice-versa.

Primeiro, veremos como conseguir isso usando os principais métodos Java e, depois, usaremos algumas bibliotecas de terceiros.

2. Exemplo básico deMap

Em todos os exemplos, vamos usar a mesma implementaçãoMap:

Map wordsByKey = new HashMap<>();
wordsByKey.put(1, "one");
wordsByKey.put(2, "two");
wordsByKey.put(3, "three");
wordsByKey.put(4, "four");

3. Converta umMap em umString iterando

Vamos iterar sobre todas as chaves em nossoMape, para cada uma delas, anexar a combinação de valor-chave ao nosso sobjetoStringBuilder resultante.

Para fins de formatação, podemos agrupar o resultado entre colchetes:

public String convertWithIteration(Map map) {
    StringBuilder mapAsString = new StringBuilder("{");
    for (Integer key : map.keySet()) {
        mapAsString.append(key + "=" + map.get(key) + ", ");
    }
    mapAsString.delete(mapAsString.length()-2, mapAsString.length()).append("}");
    return mapAsString.toString();
}

Para verificar se convertemos nossoMap corretamente, vamos executar o seguinte teste:

@Test
public void givenMap_WhenUsingIteration_ThenResultingStringIsCorrect() {
    String mapAsString = MapToString.convertWithIteration(wordsByKey);
    Assert.assertEquals("{1=one, 2=two, 3=three, 4=four}", mapAsString);
}

4. ConvertaMap emString usando Java Streams

Para realizar a conversão usando streams, primeiro precisamos criar um stream com as chavesMap disponíveis.

Em segundo lugar, estamos mapeando cada chave para umString. legível

Finalmente, estamos juntando esses valores e, por uma questão de conveniência, estamos adicionando algumas regras de formatação usando o métodoCollectors.joining():

public String convertWithStream(Map map) {
    String mapAsString = map.keySet().stream()
      .map(key -> key + "=" + map.get(key))
      .collect(Collectors.joining(", ", "{", "}"));
    return mapAsString;
}

5. Converta aMap em aString usando goiaba

Vamos adicionarGuava em nosso projeto e ver como podemos alcançar a conversão em uma única linha de código:


    com.google.guava
    guava
    27.0.1-jre

Para realizar a conversão usando a classeJoiner de Guava, precisamos definir um separador entre diferentes entradasMap e um separador entre chaves e valores:

public String convertWithGuava(Map map) {
    return Joiner.on(",").withKeyValueSeparator("=").join(map);
}

6. ConvertaMap emString usando o Apache Commons

Para usarApache Commons, vamos adicionar a seguinte dependência primeiro:


    org.apache.commons
    commons-collections4
    4.2

A junção é muito simples - só precisamos chamar o métodoStringUtils.join:

public String convertWithApache(Map map) {
    return StringUtils.join(map);
}

Uma menção especial vai para o métododebugPrint disponível no Apache Commons. É muito útil para fins de depuração.

Quando chamamos:

MapUtils.debugPrint(System.out, "Map as String", wordsByKey);

O texto de depuração será gravado no console:

Map as String =
{
    1 = one java.lang.String
    2 = two java.lang.String
    3 = three java.lang.String
    4 = four java.lang.String
} java.util.HashMap

7. Converta umString em umMap usando fluxos

Para realizar a conversão deString emMap, vamos definir onde dividir e como extrair chaves e valores:

public Map convertWithStream(String mapAsString) {
    Map map = Arrays.stream(mapAsString.split(","))
      .map(entry -> entry.split("="))
      .collect(Collectors.toMap(entry -> entry[0], entry -> entry[1]));
    return map;
}

8. Converta aString em aMap usando goiaba

Uma versão mais compacta do exposto acima é contar com o Guava para fazer a divisão e a conversão para nós em um processo de uma linha:

public Map convertWithGuava(String mapAsString) {
    return Splitter.on(',').withKeyValueSeparator('=').split(mapAsString);
}

9. Conclusão

Neste tutorial, vimos como converterMap emString e vice-versa, usando métodos Java principais e bibliotecas de terceiros.

A implementação de todos esses exemplos pode ser encontradaover on GitHub.