Guava - Collections Join et Split
1. Vue d'ensemble
Dans ce tutoriel, nous allons apprendre à utiliserthe Joiner and Splitter in the Guava library. Nous convertirons les collections en une chaîne avec lesJoiner et nous diviserons une chaîne en une collection avec lesSplitter.
2. ConvertirList enString en utilisantJoiner
Commençons par un exemple simple pour joindre unList à unString en utilisantJoiner. Dans l'exemple suivant, nous joignons unList de noms en unString en utilisant la virgule «,» comme séparateur:
@Test
public void whenConvertListToString_thenConverted() {
List names = Lists.newArrayList("John", "Jane", "Adam", "Tom");
String result = Joiner.on(",").join(names);
assertEquals(result, "John,Jane,Adam,Tom");
}
3. ConvertirMap enString en utilisantJoiner
Ensuite, voyons comment utiliserJoiner pour convertir unMap enString. Dans l'exemple suivant, nous utilisonswithKeyValueSeparator() pour joindre la clé avec sa valeur:
@Test
public void whenConvertMapToString_thenConverted() {
Map salary = Maps.newHashMap();
salary.put("John", 1000);
salary.put("Jane", 1500);
String result = Joiner.on(" , ").withKeyValueSeparator(" = ")
.join(salary);
assertThat(result, containsString("John = 1000"));
assertThat(result, containsString("Jane = 1500"));
}
4. Rejoindre des collections imbriquées
Voyons maintenant comment joindre des collections imbriquées dans unString. Dans l'exemple suivant, nous joignons le résultat de la transformation de chaqueList enString:
@Test
public void whenJoinNestedCollections_thenJoined() {
List> nested = Lists.newArrayList(
Lists.newArrayList("apple", "banana", "orange"),
Lists.newArrayList("cat", "dog", "bird"),
Lists.newArrayList("John", "Jane", "Adam"));
String result = Joiner.on(";").join(Iterables.transform(nested,
new Function, String>() {
@Override
public String apply(List input) {
return Joiner.on("-").join(input);
}
}));
assertThat(result, containsString("apple-banana-orange"));
assertThat(result, containsString("cat-dog-bird"));
assertThat(result, containsString("apple-banana-orange"));
}
5. Gérer les valeurs nulles lors de l'utilisation deJoiner
Voyons maintenant différentes manières de gérer les valeurs nulles lors de l'utilisation de Joiner.
Pourskip null values tout en rejoignant la collection, utilisezskipNulls() comme dans l'exemple suivant:
@Test
public void whenConvertListToStringAndSkipNull_thenConverted() {
List names = Lists.newArrayList("John", null, "Jane", "Adam", "Tom");
String result = Joiner.on(",").skipNulls().join(names);
assertEquals(result, "John,Jane,Adam,Tom");
}
Si vous ne souhaitez pas ignorer les valeurs nulles et que vous souhaitezreplace them instead, utilisezuseForNull() comme dans l'exemple suivant:
@Test
public void whenUseForNull_thenUsed() {
List names = Lists.newArrayList("John", null, "Jane", "Adam", "Tom");
String result = Joiner.on(",").useForNull("nameless").join(names);
assertEquals(result, "John,nameless,Jane,Adam,Tom");
}
Notez queuseForNull() ne modifie pas la liste d'origine, il n'affecte que la sortie de la jointure.
6. CréerList à partir deString en utilisantSplitter
Voyons maintenant comment diviser unString en unList. Dans l'exemple suivant, nous utilisons le séparateur «-» pour diviser l'entréeString enList:
@Test
public void whenCreateListFromString_thenCreated() {
String input = "apple - banana - orange";
List result = Splitter.on("-").trimResults()
.splitToList(input);
assertThat(result, contains("apple", "banana", "orange"));
}
Notez quetrimResults() supprime les espaces blancs de début et de fin des sous-chaînes résultantes.
7. CréerMap à partir deString en utilisantSplitter
Ensuite, voyons comment créer une carte à partir d'une chaîne à l'aide de Splitter. Dans l'exemple suivant, nous utilisonswithKeyValueSeparator() pour diviser unString en unMap:
@Test
public void whenCreateMapFromString_thenCreated() {
String input = "John=first,Adam=second";
Map result = Splitter.on(",")
.withKeyValueSeparator("=")
.split(input);
assertEquals("first", result.get("John"));
assertEquals("second", result.get("Adam"));
}
8. FractionnerString avec plusieurs séparateurs
Voyons maintenant comment diviser unString avec plusieurs séparateurs. Dans l'exemple suivant, nous utilisons à la fois "." et "," pour diviser nosString:
@Test
public void whenSplitStringOnMultipleSeparator_thenSplit() {
String input = "apple.banana,,orange,,.";
List result = Splitter.onPattern("[.,]")
.omitEmptyStrings()
.splitToList(input);
assertThat(result, contains("apple", "banana", "orange"));
}
Notez queomitEmptyStrings() ignore les chaînes vides et ne les ajoute pas auxList résultants.
9. Fractionner unString à une longueur spécifique
Ensuite, voyons comment fractionner unString à une longueur spécifique. Dans l'exemple suivant, nous divisons nosString tous les 3 caractères:
@Test
public void whenSplitStringOnSpecificLength_thenSplit() {
String input = "Hello world";
List result = Splitter.fixedLength(3).splitToList(input);
assertThat(result, contains("Hel", "lo ", "wor", "ld"));
}
10. Limiter le résultat du fractionnement
Enfin, voyons comment limiter le résultat du fractionnement. Si vous voulez queSplitter soitstop splitting after specific number of items - utilisezlimit() comme dans l'exemple suivant:
@Test
public void whenLimitSplitting_thenLimited() {
String input = "a,b,c,d,e";
List result = Splitter.on(",")
.limit(4)
.splitToList(input);
assertEquals(4, result.size());
assertThat(result, contains("a", "b", "c", "d,e"));
}
11. Conclusion
Dans ce didacticiel, nous avons illustré comment utiliser à la fois lesJoiner etSplitter dans Guava pour effectuer diverses transformations entre les collections et les chaînes.
L'implémentation de tous ces exemples et extraits de codecan be found in my Guava github project - il s'agit d'un projet basé sur Eclipse, il devrait donc être facile à importer et à exécuter tel quel.