Goiaba - Coleções de junção e divisão

Goiaba - Coleções de junção e divisão

1. Visão geral

Neste tutorial, aprenderemos como usarthe Joiner and Splitter in the Guava library. Vamos converter coleções em uma String comJoinere vamos dividir uma String em uma coleção comSplitter.

2. ConvertaList emString usandoJoiner

Vamos começar com um exemplo simples para unirList emString usandoJoiner. No exemplo a seguir, unimosList de nomes em umString usando a vírgula “,” como separador:

@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. ConvertaMap emString usandoJoiner

A seguir - vamos ver como usarJoiner para converterMap emString. No exemplo a seguir, usamoswithKeyValueSeparator() para juntar a chave com seu valor:

@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. Junte-se a coleções aninhadas

Agora - vamos ver como juntar coleções aninhadas em umString. No exemplo a seguir, juntamos o resultado da transformação de cadaList emString:

@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. Lidar com valores nulos ao usarJoiner

Agora, vamos ver diferentes maneiras de lidar com valores nulos ao usar o Joiner.

Paraskip null values ao ingressar na coleção, useskipNulls() como no exemplo a seguir:

@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");
}

Se você não quiser pular valores nulos e quiserreplace them instead, useuseForNull() como no exemplo a seguir:

@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");
}

Observe queuseForNull() não altera a lista original, apenas afeta a saída da junção.

6. CrieList a partir deString usandoSplitter

Agora - vamos ver como dividir umString em umList. No exemplo a seguir, usamos o separador “-” para dividir a entradaString emList:

@Test
public void whenCreateListFromString_thenCreated() {
    String input = "apple - banana - orange";
    List result = Splitter.on("-").trimResults()
                                          .splitToList(input);

    assertThat(result, contains("apple", "banana", "orange"));
}

Observe quetrimResults() remove os espaços em branco à esquerda e à direita das substrings resultantes.

7. CrieMap a partir deString usandoSplitter

A seguir - vamos ver como criar um mapa de string usando o divisor. No exemplo a seguir, usamoswithKeyValueSeparator() para dividir umString em umMap:

@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. DividaString com vários separadores

Agora - vamos ver como dividir umString com vários separadores. No exemplo a seguir, usamos ambos “.” e “,” para dividir nossoString:

@Test
public void whenSplitStringOnMultipleSeparator_thenSplit() {
    String input = "apple.banana,,orange,,.";
    List result = Splitter.onPattern("[.,]")
                                  .omitEmptyStrings()
                                  .splitToList(input);

    assertThat(result, contains("apple", "banana", "orange"));
}

Observe queomitEmptyStrings() ignora strings vazias e não as adiciona aosList resultantes.

9. Divida aString em comprimento específico

A seguir - vamos dar uma olhada na divisão deString em um comprimento específico. No exemplo a seguir, dividimos nossoString a cada 3 caracteres:

@Test
public void whenSplitStringOnSpecificLength_thenSplit() {
    String input = "Hello world";
    List result = Splitter.fixedLength(3).splitToList(input);

    assertThat(result, contains("Hel", "lo ", "wor", "ld"));
}

10. Limite o resultado da divisão

Finalmente - vamos ver como limitar o resultado da divisão. Se você quiserSplitter parastop splitting after specific number of items - uselimit() como no exemplo a seguir:

@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. Conclusão

Neste tutorial, ilustramos como usarJoinereSplitter no Guava para fazer uma variedade de transformações entre coleções e Strings.

A implementação de todos esses exemplos e fragmentos de códigocan be found in my Guava github project - este é um projeto baseado no Eclipse, portanto, deve ser fácil de importar e executar como está.