Desde hace mucho tiempo quiero empezar a escribir sobre Java 8 y el uso de Lambda Expressions. Por cuestiones de tiempo no me ha sido posible dedicarme a escribir sobre el tema. En esta ocasión compartiré pequeños tips sobre el manejo de listas en Java. Ya hemos escrito sobre listas en este blog:
Las expresiones lambda son sumamente útiles cuando se manejan grandes cantidades de datos almacenados en listas. Supongamos que tenemos la siguiente colección de números:
1 2 3 4 5 6 7 8 9 10 11 |
List<Double> t = new ArrayList<Double>(); t.add(20.5); t.add(20.3); t.add(20.8); t.add(20.9); t.add(20.1); t.add(20.1); t.add(20.5); t.add(20.6); t.add(20.7); |
Ahora deseamos saber cual es el máximo y el mínimo de esta serie de datos. En programación convencional haríamos lo siguiente:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
double max = 0; for (int i = 0; i < t.size(); i++) { if (t.get(i) > max) { max = t.get(i); } } double min = max; for (int i = 0; i < t.size(); i++) { if (t.get(i) < min) { min = t.get(i); } } System.out.println("Máximo: " + max); System.out.println("Mínimo: " + min); |
Esto funciona bien pero no es eficiente. Para cuestiones de simplicidad (bueno no tanto pero todo es relativo) utilizamos expresiones Lambda propias de la versión 8 del lenguaje de programación Java. El código mostrado arriba quedaría así:
1 2 |
System.out.println("Máximo: " + t.stream().mapToDouble(i -> i).max().getAsDouble()); System.out.println("Máximo: " + t.stream().mapToDouble(i -> i).min().getAsDouble()); |
Solo dos líneas… ¿Interesante no? Probemos el código completo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
import java.util.ArrayList; import java.util.List; public class SiCADA { public static void main(String[] args) { List<Double> t = new ArrayList<Double>(); t.add(20.5); t.add(20.3); t.add(20.8); t.add(20.9); t.add(20.1); t.add(20.1); t.add(20.5); t.add(20.6); t.add(20.7); System.out.println("Programación Convencional"); System.out.println("-------------------------"); double max = 0; for (int i = 0; i < t.size(); i++) { if (t.get(i) > max) { max = t.get(i); } } double min = max; for (int i = 0; i < t.size(); i++) { if (t.get(i) < min) { min = t.get(i); } } System.out.println("Máximo: " + max); System.out.println("Mínimo: " + min); System.out.println("-------------------------"); System.out.println("Expresiones Lambda"); System.out.println("-------------------------"); System.out.println("Máximo: " + t.stream().mapToDouble(i -> i).max().getAsDouble()); System.out.println("Máximo: " + t.stream().mapToDouble(i -> i).min().getAsDouble()); } } |
El resultado es el siguiente:
El resultado es exactamente el mismo, pero utilizando menos instrucciones. Espero que esta información les sea útil. Saludos.
Saludos, con que tipo de instrucciones se obtiene mayor velocidad de compilacion?
¿A qué te refieres con mayor velocidad de compilación?
Maestro !!!!
Hola, veo que se inicializa a max en 0, pero esto funciona si el array solo contiene numeros positivos. Hay una forma de obtener el menor de los double para inicializar ocrrectamente a max?
Hola. Lo del max=0 es en programación convencional. Con las expresiones Lambda eso no importa
Una pregunta, tal vez me puedan ayudar, por ejemplo supongamos que «I=6.1» es la respuesta a una operación que tengo, quiero que de una lista de número por ejemplo 6.1, 7.2, 8.3 me escoga el inmediato superior, como sería eso?
me podrian decir como hago para recuperar el menor?
Ahí te debe salir la opción, cuando colocas el punto y te salen los métodos disponibles
Si pero, no me funciono el del .min() con la expresión lambada. Me seguia estirando el mayor
tuve que hacer lo tradicional con la vieja confiable FOR
Es increíble, recién estoy aprendiendo y justo necesitaba resolver un ejercicio así. Muchas gracias.