Converter uma sequência em maiúsculas e minúsculas
1. Introdução
Neste breve tutorial, mostraremos como converter umString para o formato de caixa de título em Java.
Mostraremos diferentes maneiras de implementar um método personalizado e também mostraremos como fazer isso usando bibliotecas de terceiros.
2. Principais soluções Java
2.1. Iterando por meio dos caracteresString
Uma maneira de converterString em maiúsculas e minúsculas é iterando por todos os caracteres deString.
Para fazer isso, quando encontramos um separador de palavras, colocamos em maiúscula o próximo caractere. Depois disso, alteramos o restante dos caracteres para minúsculas até chegarmos ao próximo separador de palavras.
Vamos usar um espaço em branco como separador de palavras e implementar esta solução:
public static String convertToTitleCaseIteratingChars(String text) {
if (text == null || text.isEmpty()) {
return text;
}
StringBuilder converted = new StringBuilder();
boolean convertNext = true;
for (char ch : text.toCharArray()) {
if (Character.isSpaceChar(ch)) {
convertNext = true;
} else if (convertNext) {
ch = Character.toTitleCase(ch);
convertNext = false;
} else {
ch = Character.toLowerCase(ch);
}
converted.append(ch);
}
return converted.toString();
}
Como podemos ver, usamos o métodoCharacter.toTitleCase para fazer a conversão, já queit checks the title case equivalent of a Character in Unicode.
Se testarmos esse método usando estas entradas:
tHis IS a tiTLe
tHis, IS a tiTLe
Obtemos os seguintes resultados esperados:
This Is A Title
This, Is A Title
2.2. Divisão em palavras
Outra abordagem para fazer isso é dividirString em palavras, converter todas as palavras em maiúsculas e, finalmente, juntar todas as palavras novamente usando o mesmo separador de palavras.
Vamos ver no código, usando novamente o espaço em branco como separador de palavras e a APIStream útil:
private static final String WORD_SEPARATOR = " ";
public static String convertToTitleCaseSplitting(String text) {
if (text == null || text.isEmpty()) {
return text;
}
return Arrays
.stream(text.split(WORD_SEPARATOR))
.map(word -> word.isEmpty()
? word
: Character.toTitleCase(word.charAt(0)) + word
.substring(1)
.toLowerCase())
.collect(Collectors.joining(WORD_SEPARATOR));
}
Usando as mesmas entradas de antes, obtemos exatamente as mesmas saídas:
This Is A Title
This, Is A Title
3. Usando o Apache Commons
Caso não desejemos implementar nosso próprio método personalizado, podemos usar a biblioteca Apache Commons. A configuração desta biblioteca é explicada nestearticle.
Isso fornecethe WordUtils class, that has the capitalizeFully() method que faz exatamente o que queremos alcançar:
public static String convertToTileCaseWordUtilsFull(String text) {
return WordUtils.capitalizeFully(text);
}
Como podemos ver, isso é muito fácil de usar e, se o testarmos com as mesmas entradas de antes, obteremos os mesmos resultados:
This Is A Title
This, Is A Title
Além disso, a classeWordUtils forneceanother capitalize() method que funciona de maneira semelhante acapitalizeFully(),, excetoonly changes the first character of each word. Isso significa que ele não converte o restante dos caracteres em minúsculas.
Vamos ver como podemos usar isso:
public static String convertToTileCaseWordUtils(String text) {
return WordUtils.capitalize(text);
}
Agora, se o testarmos com as mesmas entradas de antes, obteremos essas diferentes saídas:
THis IS A TiTLe
THis, IS A TiTLe
4. Usando ICU4J
Outra biblioteca que podemos usar é o ICU4J, que fornece suporte a Unicode e à globalização.
Para usá-lo, precisamos adicionar esta dependência ao nosso projeto:
com.ibm.icu
icu4j
61.1
A versão mais recente pode ser encontradahere.
Esta biblioteca funciona de maneira muito semelhante aWordUtils, mas podemos especificar umBreakIterator para dizer ao método como queremos dividir oString e, portanto, quais palavras queremos converter em título caso:
public static String convertToTitleCaseIcu4j(String text) {
if (text == null || text.isEmpty()) {
return text;
}
return UCharacter.toTitleCase(text, BreakIterator.getTitleInstance());
}
Como podemos ver, eles têm umBreakIterator específico para trabalhar com títulos. If we don’t specify any BreakIterator it uses the defaults from Unicode, que neste caso geram os mesmos resultados.
Além disso, observe que este método nos permite especificar oLocale dosString que estamos convertendo para fazer uma conversão específica de local.
5. Conclusão
Neste breve artigo, mostramos como converter umString para o formato de caixa de título em Java. Usamos nossas implementações personalizadas primeiro e, depois disso, mostramos como fazer isso usando bibliotecas externas.
Como sempre, o código-fonte completo dos exemplos está disponívelover on GitHub.