Concatenando seqüências de caracteres em Java

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.