1. Conversão de dados

A Stream<T>classe também possui um método que permite converter dados de um tipo para outro. Este método é map().

Ele também retorna um stream, mas com elementos de um tipo diferente. O map()método usa como argumento de método uma função que converte um tipo de dados em outro.

Exemplos:

Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5);
Stream<String> stream2 = stream.map((x) -> String.valueOf(x));
Convertendo um Integerfluxo em um Stringfluxo

O argumento da função passado para o map()método recebe um número xe retorna sua representação de string. A propósito, você pode escrever este código de forma mais compacta:

Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5);
Stream<String> stream2 = stream.map(String::valueOf);
Convertendo um Integerfluxo em um Stringfluxo

Convertendo uma string em um número

Da mesma forma, você pode escrever um código para converter uma string em um número — isso também não é complicado:

Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5);
Stream<String> stream2 = stream.map(String::valueOf);
Stream<Integer> stream3 = stream2.map(Integer::parseInt);
Convertendo um Stringfluxo em um Integerfluxo

Convertendo uma string em umaURI

As operações de conversão de dados podem consumir muitos recursos e muito tempo. Digamos que queremos converter uma coleção de strings em objetos URI. Isso é muito fácil de fazer, porque o construtor URI usa uma string como argumento.

ArrayList<String> list = new ArrayList<String>();
list.add("https://google.com");
list.add("https://linkedin.com");
list.add("https://yandex.com");

Stream<URI> stream = list.stream().map( URI::new );
Convertendo um Stringfluxo em um URIfluxo

Criamos uma coleção e a preenchemos com 3 endereços da web. Em seguida, obtivemos um Stream<String>objeto da coleção e, por sua vez, desse fluxo, obtivemos um Stream<URI>objeto. Passamos ao método map uma referência ao método que será usado para converter cada String em um URI.

Este método (construtor) deve receber a Stringcomo argumento. Tudo parece estar perfeito...


2. Exceções

Podemos esperar que o código acima funcione, mas não funcionará — o programa não compilará. E não porque cometemos um erro em algum lugar, mas porque os criadores do Java erraram.

Era uma vez, eles tiveram a brilhante ideia de adicionar uma exceção verificada ( URISyntaxException) ao URIconstrutor da classe! E essas exceções devem ser agrupadas em um arquivo try-catch.

Portanto, a última linha do nosso código ficará assim:

Stream<URI> stream = list.stream().map(str ->
{
  try
  {
     return new URI(str);
  }
  catch (URISyntaxException e)
  {
     e.printStackTrace();
     return null;
  }
});

O que podemos dizer? Você deve pensar duas vezes antes de usar uma exceção verificada . E pense três vezes antes de usá-los em um construtor.