1. Conversión de datos

La Stream<T>clase también tiene un método que le permite convertir datos de un tipo a otro. Este método es map().

También devuelve un flujo, pero con elementos de un tipo diferente. El map()método toma como argumento de método una función que convierte un tipo de datos en otro.

Ejemplos:

Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5);
Stream<String> stream2 = stream.map((x) -> String.valueOf(x));
Convertir una Integertransmisión en una Stringtransmisión

El argumento de función pasado al map()método toma un número xy devuelve su representación de cadena. Por cierto, puedes escribir este código de forma más compacta:

Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5);
Stream<String> stream2 = stream.map(String::valueOf);
Convertir una Integertransmisión en una Stringtransmisión

Convertir una cadena en un número

Del mismo modo, puede escribir código para convertir una cadena en un número; esto tampoco es 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);
Convertir una Stringsecuencia en una Integersecuencia

Convertir una cadena en unURI

Las operaciones de conversión de datos pueden consumir mucho tiempo y recursos. Digamos que queremos convertir una colección de cadenas en objetos URI. Esto es muy fácil de hacer, porque el constructor URI toma una cadena 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 );
Convertir un Stringflujo en un URIflujo

Creamos una colección y la poblamos con 3 direcciones web. Luego obtuvimos un Stream<String>objeto de la colección y, a su vez, de ese flujo obtuvimos un Stream<URI>objeto. Le pasamos al método map una referencia al método que se usará para convertir cada String en un URI.

Este método (constructor) debe tomar a Stringcomo argumento. Todo parece ser perfecto...


2. Excepciones

Podríamos esperar que el código anterior funcione, pero no lo hará: el programa no se compilará. Y no porque hayamos cometido un error en alguna parte, sino porque los creadores de Java se equivocaron.

Érase una vez, tuvieron la brillante idea de agregar una excepción comprobada ( URISyntaxException) al URIconstructor de la clase. Y tales excepciones deben incluirse en un archivo try-catch.

Así que la última línea de nuestro código se verá así:

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

¿Qué podemos decir? Debería pensarlo dos veces antes de usar una excepción marcada . Y piense tres veces antes de usarlos en un constructor.