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));
Integer
fluxo em um
String
fluxo
O argumento da função passado para o map()
método recebe um número x
e 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);
Integer
fluxo em um
String
fluxo
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);
String
fluxo em um
Integer
fluxo
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 );
String
fluxo em um
URI
fluxo
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 String
como 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 URI
construtor 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.
GO TO FULL VERSION