Conversões Java IntStream

Conversões Java IntStream

1. Introdução

Neste tutorial rápido, vamos passar porall the possibilities regarding IntStream conversions to other types.

Leituras interessantes sobreboxing and unboxing ouiterating são recomendadas como um complemento deste tutorial.

2. IntStream aArray

Vamos começar a explorar como podemos converterfrom an IntStream object to an array of ints.

Por causa deste exemplo, vamos gerar os primeiros 50 números pares e armazená-los em uma matriz como resultado:

@Test
public void intStreamToArray() {
  int[] first50EvenNumbers = IntStream.iterate(0, i -> i + 2)
    .limit(50)
    .toArray();

  assertThat(first50EvenNumbers).hasSize(50);
  assertThat(first50EvenNumbers[2]).isEqualTo(4);
}

Primeiro, vamos criar um fluxo infinito de inteiros começando em 0 e iterando adicionando 2 a cada elemento. Em seguida, precisamos adicionar uma operação intermediárialimit para fazer com que esta operação, de alguma forma, termine.

Finalmente, vamos usar a operação de terminaçãocollect para reunir esteStream em uma matriz.

Esta é uma maneira direta de gerar uma matriz deints.

3. IntStream aList

Vamos converter agoraan IntStream to a List of Integers.

Nesse caso, apenas para adicionar mais variedade ao exemplo, vamos usar o métodorange em vez do métodoiterate. Este método irá gerar umIntStream deint 0 aint 50 (não incluído, pois é um intervalo aberto):

@Test
public void intStreamToList() {
  List first50IntegerNumbers = IntStream.range(0, 50)
    .boxed()
    .collect(Collectors.toList());

  assertThat(first50IntegerNumbers).hasSize(50);
  assertThat(first50IntegerNumbers.get(2)).isEqualTo(2);
}

Neste exemplo, usamos o métodorange. A parte mais notória aqui é usarthe method boxed, that, as its name points out, will box all the int elements in the IntStream and will return a Stream<Integer>.

Finalmente, podemos usar um coletor para obter uma lista deintegers.

4. IntStream aString

Para o nosso último tópico, vamos explorar como poderíamos obtera String from an IntStream.

Nesse caso, geraremos apenas os primeiros 3ints (0, 1 e 2):

@Test
public void intStreamToString() {
  String first3numbers = IntStream.of(0, 1, 2)
    .mapToObj(String::valueOf)
    .collect(Collectors.joining(", ", "[", "]"));

  assertThat(first3numbers).isEqualTo("[0, 1, 2]");
}

Primeiro, neste caso, construímos umIntStream com o construtorIntStream.of(). Depois de obter oStream, precisamos de alguma formagenerate a Stream<String> from an IntStream. Portanto, temoscan use the intermediate mapToObj method que receberá umIntStreame retornará umStream do tipo do objeto resultante mapeado no método chamado.

Por fim, usamos o coletorjoining que pegaStream<String>e pode anexar cada elemento deStream usando um delimitador e, opcionalmente, um prefixo e sufixo.

5. Conclusões

Neste tutorial rápido, exploramos todas as alternativas quando precisamos converter umIntStream para qualquer outro tipo. Em particular, examinamos exemplos como a geração de um array, umList e umString.

E, como sempre, o código de amostra está disponívelover on GitHub.