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.
Pour utiliser cette bibliothèque, nous devons ajouter le https://search.maven.org/classic/#search%7Cga%7C1%7Cg%3A%22org.apache.commons%22%20AND%20a%3A%22commons -lang3% 22[commons-lang3] https://search.maven.org/classic/#search%7Cga%7C1%7Cg%3A%22org.apache.commons%22%20AND%20a%3A%22commons-lang3 % 22[dépendance]à notre pom.xml :
<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].