Goyave - Regrouper et diviser des collections

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.