Unir matriz de primitivas com separador em Java

Unir matriz de primitivas com separador em Java

1. Introdução

Neste tutorial rápido, aprenderemos comojoin an array of primitives with a single-character separator in Java. Para nossos exemplos, vamos considerar duas matrizes: uma matriz deint e uma matriz dechar.

2. Definindo o problema

Vamos começar definindo uma matriz deint e uma matriz dechar para os exemplos, bem como o caractere separador que usaremos para juntar seus conteúdos:

int[] intArray = {1, 2, 3, 4, 5, 6, 7, 8, 9};
char[] charArray = {'a', 'b', 'c', 'd', 'e', 'f'};
char separatorChar = '-';
String separator = String.valueOf(separatorChar);

Observe que incluímos um separadorchar eString desdesome of the methods we’ll show require a char argument, while others require a String argument.

Os resultados da operação de junção conterão“1-2-3-4-5-6-7-8-9” para a matrizint, e“a-b-c-d-e-f” para a matrizchar.

3. Collectors.joining()

Vamos começar com um dos métodos disponíveis na API Java 8 Stream -Collectors.joining().

Primeiro, criamos umStream a partir de um array de primitivas usando o métodoArrays.stream() encontrado no pacotejava.util. Em seguida, mapeamos cada elemento paraString. E finalmente, concatenamos os elementos com nosso separador fornecido.

Vamos começar com nossa matrizint:

String joined = Arrays.stream(intArray)
  .mapToObj(String::valueOf)
  .collect(Collectors.joining(separator));

When joining our char array with this method, we must first wrap the char array into CharBuffer and then project it to char again. Isso ocorre porque o métodochars() retornaStream dos valores deint.

Infelizmente, a API Java Stream não fornece um método nativo para empacotarStream dechar.

Vamos juntar nossa matrizchar:

String joined = CharBuffer.wrap(charArray).chars()
  .mapToObj(intValue -> String.valueOf((char) intValue))
  .collect(Collectors.joining(separator));

4. StringJoiner

Da mesma forma queCollectors.joining(), esta abordagem usa a API Stream, mas em vez de coletar elementos, ela itera através dos elementos e os adiciona a uma instânciaStringJoiner:

StringJoiner intStringJoiner = new StringJoiner(separator);
Arrays.stream(intArray)
  .mapToObj(String::valueOf)
  .forEach(intStringJoiner::add);
String joined = intStringJoiner.toString();

Again, we have to wrap our char array into CharBuffer ao usar a API Stream:

StringJoiner charStringJoiner = new StringJoiner(separator);
CharBuffer.wrap(charArray).chars()
  .mapToObj(intChar -> String.valueOf((char) intChar))
  .forEach(charStringJoiner::add);
String joined = charStringJoiner.toString();

5. Apache Commons Lang

A bibliotecaApache Commons Lang fornece alguns métodos úteis nas classesStringUtilseArrayUtils que podemos usar para unir nossos arrays primitivos.

Para usar esta biblioteca, precisaremos adicionarcommons-lang3dependency ao nossopom.xml:


    org.apache.commons
    commons-lang3
    3.8.1

Ao trabalhar com um separadorString, usaremosStringUtils eArrayUtils.

Vamos usá-los juntos para juntar nossa matrizint:

String joined = StringUtils.join(ArrayUtils.toObject(intArray), separator);

Ou, se estivermos usando um tipochar primitivo como separador, podemos simplesmente escrever:

String joined = StringUtils.join(intArray, separatorChar);

As implementações para juntar nossa matrizchar são bastante semelhantes:

String joined = StringUtils.join(ArrayUtils.toObject(charArray), separator);

E ao usar um separadorchar:

String joined = StringUtils.join(charArray, separatorChar);

6. Goiaba

A bibliotecaGoogle’s Guava fornece a classeJoiner que podemos usar para unir nossos arrays. Para usar Guava em nosso projeto, precisamos adicionarthe guava Maven dependency:


    com.google.guava
    guava
    27.0.1-jre

Vamos juntar nossa matrizint usando a classeJoiner:

String joined = Joiner.on(separator).join(Ints.asList(intArray));

Neste exemplo, também usamos o métodoInts.asList() do Guava, que transforma bem a matriz de primitivas emList deInteger.

O Guava oferece um método semelhante para converter uma matrizchar emList deCharacter. Como resultado, juntar a nossa matrizchar se parece muito com o exemplo acima que usou ointmatriz s:

String joined = Joiner.on(separator).join(Chars.asList(charArray));

7. StringBuilder

Finalmente,if we can’t use either Java 8 or third-party libraries, we can manually join an array of elements with StringBuilder. Nesse caso, a implementação é idêntica para os dois tipos de matrizes:

if (array.length == 0) {
    return "";
}
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < array.length - 1; i++) {
    stringBuilder.append(array[i]);
    stringBuilder.append(separator);
}
stringBuilder.append(array[array.length - 1]);
String joined = stringBuilder.toString();

8. Conclusão

Este artigo rápido ilustra várias maneiras de associar uma matriz de primitivas a um determinado caractere ou cadeia separadora. Mostramos exemplos usando soluções JDK nativas, bem como soluções adicionais usando duas bibliotecas de terceiros - Apache Commons Lang e Guava.

Como sempre, o código completo usado neste artigo está disponívelover on GitHub.