El concepto de Java 8 IntStream hace referencia a Streams compuestos por números enteros. Es algo que en muchas ocasiones puede sernos util a la hora de trabajar ya que aporta algunos métodos interesantes, vamos a verlos:
package com.arquitecturajava; import java.util.stream.IntStream; public class Principal { public static void main(String[] args) { IntStream it= IntStream.of(1,2,3,4,5,6); it.forEach(System.out::println); } }
Nuestro primer ejemplo crea un Stream de seis números y lo imprime por pantalla. Podemos hacer lo mismo de una forma más compacta usando el método range() e imprimir una lista de 100 números por ejemplo:
package com.arquitecturajava; import java.util.stream.IntStream; public class Principal2 { public static void main(String[] args) { IntStream it= IntStream.range(0, 100); it.forEach(System.out::println); } }
De esta forma es muy sencillo realizar cálculos sobre la suma de n términos, bastaría con modificar el código e invocar al método sum():
System.out.println(IntStream.range(0, 100).sum());
El resultado imprimirá :
Usando IntStream
El código es mucho más compacto que usar el clásico bucle for. A veces se nos olvida que los IntStreams pueden simplificar sobre manera operaciones cotidianas. Supongamos que tenemos un array de cadenas y queremos obtener la media de la longitud de todas las cadenas . Se trata de un programa sencillo de implementar en Java clásico:
package com.arquitecturajava; public class Principal4 { public static void main(String[] args) { String[] cadenas= {"hello","my","name", "is","cecilio"}; double total=0; double media=0; for (int i=0;i<cadenas.length;i++) { total+=cadenas[i].length(); } media=total/cadenas.length; System.out.println(media); } }
El resultado por consola sera:
El código es muy muy sencillo de entender pero son bastantes lineas. ¿ Podríamos haber usado Streams numéricos para simplificarlo? . La respuesta es SI y el código queda mucho más elegante.
package com.arquitecturajava; import java.util.Arrays; public class Principal5 { public static void main(String[] args) { String[] cadenas = { "hello", "my", "name", "is", "cecilio" }; System.out.println(Arrays.stream(cadenas).mapToInt(String::length).average().getAsDouble()); } }
El resultado será idéntico.
Hemos realizado varias operaciones.
- Hemos convertido el array en un stream
- Hemos mapeado la propiedad length para convertir el Stream en un Stream de números.
- Después hemos invocado la propiedad average para calcular la media
- Finalmente se usa el método get para obtener un resultado.
Acabamos de usar Java 8 para reducir un bucle for y una serie de transformaciones a una única linea.
Otros artículos relacionados :
Gracias por tus ejemplos cecilio 🙂
Una duda, soy novato en java aun, los parametros se envia por valor o referencia en java? 🙂
Saludos.
Es una buena pregunta a ver si escribo algo sobre ella ,gracias por el aporte . En principio si son tipos básicos es por valor, si son objetos es como por referencia
Buen ejemplo Cecicilio. Siempre se aprenden cosas en tu blog.
Muchas gracias!
gracias , me alegro que te sea util 🙂