Concatenando seqüências de caracteres em Java
1. Introdução
Java fornece um número substancial de métodos e classes dedicados aconcatenating Strings.
Neste tutorial, vamos mergulhar em vários deles, bem comooutline some common pitfalls and bad practices.
2. StringBuilder
A primeira é a humildeStringBuilder. Esta classeprovides an array of String-building utilities que facilita o trabalho deString manipulação.
Vamos construir um exemplo rápido deString concatenation usando o sclassStringBuilder :
StringBuilder stringBuilder = new StringBuilder(100);
stringBuilder.append("example");
stringBuilder.append(" is");
stringBuilder.append(" awesome");
assertEquals("example is awesome", stringBuilder.toString());
Internamente,StringBuilder maintains a mutable array of characters. Em nossa amostra de código, declaramos que isso tem uminitial size of 100 por meio do construtorStringBuilder . Because of this size declaration, the StringBuilder can be a very efficientway to concatenate Strings.
Também é importante notar que oStringBuffer class is the synchronized version of *StringBuilder*.
Embora a sincronização seja frequentemente sinônimo de segurança de thread, ela não é recomendada para uso em aplicativos multithread devido ao padrãoStringBuffer’s builder. Embora as chamadas individuais para um método sincronizado sejam thread-safe,multiple calls are not.
3. Operador de adição
O próximo passo é o operador de adição (+). Este é o mesmo operador que resulta na adição de números e éoverloaded to concatenate when applied to Strings.
Vamos dar uma olhada rápida em como isso funciona:
String myString = "The " + "quick " + "brown " + "fox...";
assertEquals("The quick brown fox...", myString);
À primeira vista, isso pode parecer muito mais conciso do que a composiçãoStringBuilder . No entanto, quando o código-fonte compila,the + symbol translates to chains of StringBuilder.append() calls. Devido a isso,mixing the StringBuilder and + method de concatenação éconsidered bad practice.
Além disso, a concatenaçãoString usando o operador + em um loop deve ser evitada. Como o sobjetoString é imutável, cada chamada para concatenação resultará na criação de um novo sobjetoString .
4. String methods
O próprio sclassString fornece uma série de métodos para concatenarStrings.
4.1. String.concat
Sem surpresa, o métodoString.concat é nossa primeira porta de chamada ao tentar concatenarString objetos. This method returns a String object, so chaining together the method is a useful feature.
String myString = "Both".concat(" fickle")
.concat(" dwarves")
.concat(" jinx")
.concat(" my")
.concat(" pig")
.concat(" quiz");
assertEquals("Both fickle dwarves jinx my pig quiz", myString);
Neste exemplo, nossa cadeia é iniciada com umString literal, o métodoconcat então nos permite encadear as chamadas para anexar maisStrings.
4.2. String.format
O próximo éthe String.format method, que nos permite injetar uma variedade de stemplate JavaObjects into aString .
A assinatura do smethodString.format leva umsingle String denoting our template. Estetemplate contains ‘%' characters to represent where the various Objects should be placed dentro dele.
Uma vez que nosso template é declarado, ele entãotakes a varargs Object array which is injected no template.
Vamos ver como isso funciona com um exemplo rápido:
String myString = String.format("%s %s %.2f %s %s, %s...", "I",
"ate",
2.5056302,
"blueberry",
"pies",
"oops");
assertEquals("I ate 2.51 blueberry pies, oops...", myString);
Como podemos ver acima, o método injetou nossoStrings into no formato correto.
4.3. String. join (Java 8+)
Se nossoapplication is running on Java 8or above, podemos tirar vantagem do métodoString.join . Com isso, podemosjoin an array of Strings with a common delimiter, garantindo que nenhum espaço seja perdido.
String[] strings = {"I'm", "running", "out", "of", "pangrams!"};
String myString = String.join(" ", strings);
assertEquals("I'm running out of pangrams!", myString);
Uma grande vantagem desse método é não ter que se preocupar com o delimitador entre nossas strings.
5. StringJoiner (Java 8+)
StringJoiner abstrai toda a funcionalidade deString.join em uma classe simples de usar. Oconstructor takes a delimiter, with an optional prefix and suffix. Podemos anexarStrings using o métodoadd bem nomeado.
StringJoiner fruitJoiner = new StringJoiner(", ");
fruitJoiner.add("Apples");
fruitJoiner.add("Oranges");
fruitJoiner.add("Bananas");
assertEquals("Apples, Oranges, Bananas", fruitJoiner.toString());
Usando esta classe, em vez do métodoString.join ,we can append Strings as the program runs; Não há necessidade de criar o array primeiro!
Vá para nossoarticle on StringJoiner para mais informações e exemplos.
6. Arrays.toString
No tópico de matrizes, oArray class também contéma handy toString method which nicely formats an array of objects. O métodoArrays.toString também chama o métodotoString de qualquer objeto fechado - portanto, precisamos garantir que temos um definido.
String[] myFavouriteLanguages = {"Java", "JavaScript", "Python"};
String toString = Arrays.toString(myFavouriteLanguages);
assertEquals("[Java, JavaScript, Python]", toString);
Infelizmente, o métodoArrays.toString não é personalizável e apenasoutputs a String encased in square brackets.
7. Collectors.joining (Java 8+)
Finalmente, vamos dar uma olhada no métodoCollectors.joining queallows us to funnel the output of a Stream into a single String.
List awesomeAnimals = Arrays.asList("Shark", "Panda", "Armadillo");
String animalString = awesomeAnimals.stream().collect(Collectors.joining(", "));
assertEquals("Shark, Panda, Armadillo", animalString);
O uso de streams desbloqueia todas as funcionalidades associadas aosJava 8 Stream API, como filtragem, mapeamento, iteração e muito mais.
8. Embrulhar
Neste artigo, pegamosdeep dive into the multitude of classes and methods used to concatenate Strings da linguagem Java.
Como sempre, o código-fonte está disponívelover on GitHub.