Rejoindre un tableau de primitives avec séparateur en Java

1. Introduction

Dans ce rapide tutoriel, nous allons apprendre à joindre un tableau de primitives avec un séparateur à caractère unique en Java . Pour nos exemples, considérons deux tableaux: un tableau de int et un tableau de char .

2. Définition du problème

Commençons par définir un tableau de int et un tableau de char pour les exemples, ainsi que le séparateur que nous utiliserons pour joindre leur contenu:

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);

Notez que nous avons inclus à la fois un séparateur char et String puisque certaines des méthodes que nous allons montrer nécessitent un argument char , tandis que d’autres nécessitent un argument String .

Les résultats de l’opération de jonction contiendront “1-2-3-4-5-6-7-8-9” pour le tableau int et “a-b-c-d-e-f” pour le tableau char .

3. Collectors.joining ()

Commençons par l’une des méthodes disponibles de l’API Java 8 Stream - Collectors.joining () .

Tout d’abord, nous créons un Stream à partir d’un tableau de primitives à l’aide de la méthode Arrays.stream () présente dans le package java.util . Ensuite, nous mappons chaque élément à String . Et enfin, nous concaténons les éléments avec notre séparateur donné.

Commençons par notre tableau int :

String joined = Arrays.stream(intArray)
  .mapToObj(String::valueOf)
  .collect(Collectors.joining(separator));
  • Lorsque nous rejoignons notre tableau char avec cette méthode, nous devons d’abord envelopper le tableau char dans CharBuffer , puis le projeter à nouveau à char . ** Ceci parce que la méthode chars () renvoie un Stream de int valeurs.

  • Malheureusement, l’API Java Stream ne fournit pas de méthode native pour emballer un Stream de char . **

Rejoignons notre tableau char :

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

4. StringJoiner

De manière similaire à Collectors.joining () , cette approche utilise l’API Stream, mais au lieu de collecter des éléments, elle effectue une itération sur les éléments et les ajoute à une instance StringJoiner :

StringJoiner intStringJoiner = new StringJoiner(separator);
Arrays.stream(intArray)
  .mapToObj(String::valueOf)
  .forEach(intStringJoiner::add);
String joined = intStringJoiner.toString();
  • Encore une fois, nous devons envelopper notre tableau char dans CharBuffer ** lorsque vous utilisez l’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

La bibliothèque Apache Commons Lang fournit des méthodes pratiques dans les classes StringUtils et ArrayUtils que nous pouvons utiliser pour rejoindre nos tableaux primitifs.

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.8.1</version>
</dependency>

Lorsque vous utilisez un séparateur String , nous utiliserons à la fois StringUtils et ArrayUtils .

Utilisons ces éléments ensemble pour rejoindre notre tableau int :

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

Ou, si nous utilisons un type primitif char comme séparateur, nous pouvons simplement écrire:

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

Les implémentations pour rejoindre notre tableau char sont assez similaires:

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

Et lorsque vous utilisez un séparateur char :

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

6. Goyave

La bibliothèque Google’s Guava fournit la classe Joiner que nous pouvons utiliser pour rejoindre nos tableaux. Pour utiliser Guava dans notre projet, vous devez ajouter https://search.maven.org/classic/#search%7Cga%7C1%7Cg%3A%22com.google.guava%22%20AND%20a%3A% 22guava% 22[la dépendance guava Maven]:

<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>27.0.1-jre</version>
</dependency>

Rejoignons notre tableau int en utilisant la classe Joiner :

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

Dans cet exemple, nous avons également utilisé la méthode Ints.asList () de Guava, qui transforme agréablement le tableau de primitives en un List de Integer .

Guava propose une méthode similaire pour convertir un tableau char en un List de Character. En conséquence, rejoindre notre tableau char ressemble beaucoup à l’exemple ci-dessus utilisant le tableau int :

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

7. StringBuilder

Enfin, si nous ne pouvons pas utiliser Java 8 ou des bibliothèques tierces, nous pouvons manuellement joindre un tableau d’éléments avec StringBuilder . Dans ce cas, l’implémentation est identique pour les deux types de tableaux:

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. Conclusion

Cet article rapide illustre différentes manières de joindre un tableau de primitives à un caractère ou une chaîne de séparation donné. Nous avons montré des exemples utilisant des solutions JDK natives, ainsi que des solutions supplémentaires utilisant deux bibliothèques tierces - Apache Commons Lang et Guava.

Comme toujours, le code complet utilisé dans cet article est disponible à l’adresse https://github.com/eugenp/tutorials/tree/master/java-strings de GitHub].