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));
El argumento de función pasado al map()
método toma un número x
y 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 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 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 );
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 String
como 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 URI
constructor 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.
GO TO FULL VERSION