JAVA 8: LOOP THROUGH ARRAY

JAVA: RECORRIDO DE UN ARREGLO
RECORRIDO INDEXADO
En este caso se utiliza el índice del arreglo para hacer su recorrido, tal como se ilustra en el siguiente ejemplo:

package pe.egcc.app.prueba;

/**
 *
 * @author Eric Gustavo Coronel Castillo
 * @blog gcoronelc.blogspot.com
 */
public class Prueba01 {

  public static void main(String[] args) {

    String[] ciudades = {
      "Lima","Londres","Paris",
      "New York","Roma","Berlín"
    };

    for (int i = 0; i < ciudades.length; i++) {
      String ciudad = ciudades[i];
      System.out.println(ciudad);
    }

  }

}     
La variable i toma valores desde 0 hasta el último índice (ciudades.length - 1). Con el valor del índice se accede al dato, en este caso se trata de un String. Se tiene la ventaja que el recorrido no necesariamente debe empezar desde el primero elemento, índice 0, y tampoco debe terminar en el último.
RECORRIDO TIPO COLECCIÓN
También se conoce como recorrido tipo FOR EACH, es una característica que se tiene desde Java 5, a continuación tenemos un ejemplo:
package pe.egcc.app.prueba;

/**
 *
 * @author Eric Gustavo Coronel Castillo
 * @blog gcoronelc.blogspot.com
 */
public class Prueba02 {

  public static void main(String[] args) {
    
    String[] ciudades = {
      "Lima","Londres","Paris",
      "New York","Roma","Berlín"
    };
    
    for (String ciudad: ciudades) {
      System.out.println(ciudad);
    }
    
  }
  
}    
En este caso, se recorren directamente los elementos del arreglo, por tal motivo, se utiliza una variable del mismo tipo que el arreglo, para el ejemplo es String. La variable ciudad, en cada iteración toma el valor de una ciudad, empezando con Lima y termina con Berlín.
RECORRIDO UTILIZANDO LAMBDA EXPRESSIONS
Las Expresiones Lambda aparecen en Java 8, y realmente simplifican bastante el código, lo se muestra aquí en un ejemplo:
package pe.egcc.app.prueba;

import java.util.Arrays;

/**
 *
 * @author Eric Gustavo Coronel Castillo
 * @blog gcoronelc.blogspot.com
 */
public class Prueba03 {

  public static void main(String[] args) {
    
    String[] ciudades = {
      "Lima","Londres","Paris",
      "New York","Roma","Berlín"
    };
    
    Arrays.stream(ciudades).forEach((ciudad) -> {
      System.out.println(ciudad);
    });
    
  }
  
}  
Lo primero que se debe hacer es convertir el arreglo en un Stream, luego, se le aplica la función forEach, que permite recorrer cada uno de los elementos. Como se trata de un solo parámetro y una sola instrucción se puede simplificar aún mas, como se ilustra a continuación.
    Arrays.stream(ciudades).forEach(ciudad ->
      System.out.println(ciudad));
Se puede descargar el proyecto desde el siguiente enlace:
Descargar Proyecto
CODIGO FUENTE - EUREKA-WEB-MYSQL-SPRING
En esta sección te presento un video de una aplicación web desarrollada SPRING FRAMEWORK y MYSQL.
Tú tienes acceso al código fuente de esta aplicación, después del video tienes el enlace.



JAVA 8 - FUNCTIONAL INTERFACES

JAVA: RECORRIDO DE UN ARREGLO
SINGLE ABSTRACT METHOD INTERFACES
Son interfaces cuya característica es que tienen solo un método abstracto.
Normalmente, su implementación es como una clase anónima, definida en la misma línea de código donde se crea el objeto de la clase.
A continuación tenemos un ejemplo de la interface Comparator:

package pe.egcc.app.prueba;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

/**
 *
 * @author Eric Gustavo Coronel Castillo
 * @blog gcoronelc.blogspot.com
 */
public class Prueba01 {

  public static void main(String[] args) {

    List lista = new ArrayList<>();
    lista.add("Gustavo");
    lista.add("Guino");
    lista.add("Sergio");
    lista.add("Cesar");
    lista.add("Ernesto");

    System.out.println(lista);

    Collections.sort(lista, new Comparator() {

      @Override
      public int compare(String o1, String o2) {
        return o1.compareTo(o2);
      }
    });
 
    System.out.println(lista);

  }
}
 
La definición de la clase anónima y la creación de una instancia de la misma representan acciones inseparables que se realizan en la misma línea de código.
Otros ejemplos de estos tipos de interfaces son: Runnable, ActionListener, Callable.
FUNCTIONAL INTERFACE
Las interfaces funcionales tienen un solo método abstracto, veamos un ejemplo:

package pe.egcc.app.prueba;

/**
 *
 * @author Eric Gustavo Coronel Castillo
 * @blog gcoronelc.blogspot.com
 */
@FunctionalInterface
public interface IMate {

  int opera(int n1, int n2);

}
 
En este caso, se está creando la interface IMate con un solo método, es importante utilizar la anotación @FunctionalInterface.
A continuación tenemos un ejemplo de su uso utilizando expresiones lambda:

package pe.egcc.app.prueba;

/**
 *
 * @author Eric Gustavo Coronel Castillo
 * @blog gcoronelc.blogspot.com
 */
public class Prueba02 {

  public static void main(String[] args) {
    
    IMate bean1 = (a,b) -> (a+b);
    IMate bean2 = (a,b) -> (a*b);
    
    System.out.println("5 + 8 = " + bean1.opera(5, 8));
    System.out.println("5 * 8 = " + bean2.opera(5, 8));
    
  }
}
 
Se ha creado el objeto bean1, que implementa el método como una suma, y el objeto bean2 que implementa el método como un producto.
A continuación tenemos el resultado de su ejecución:

run:
5 + 8 = 13
5 * 8 = 40
BUILD SUCCESSFUL (total time: 4 seconds)
    
EL CASO DE LA INTERFACE COMPARATOR
A continuación tenemos una implementación de la interface Comparator utilizando expresiones lambda:

package pe.egcc.app.prueba;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 *
 * @author Eric Gustavo Coronel Castillo
 * @blog gcoronelc.blogspot.com
 */
public class Prueba03 {

  public static void main(String[] args) {

    List lista = new ArrayList<>();
    lista.add("Gustavo");
    lista.add("Guino");
    lista.add("Sergio");
    lista.add("Cesar");
    lista.add("Ernesto");

    System.out.println(lista);
    
    Collections.sort(lista, (o1,o2) -> o1.compareTo(o2) );
 
    System.out.println(lista);

  }
}
 
Como se puede apreciar el codigo es mucho mas compacto.
EL CASO DE LA INTERFACE ACTIONLISTENER
A continuación tenemos una implementación clásica de la interface ActionListener:

package pe.egcc.app.prueba;

import java.awt.GridLayout;
import java.awt.HeadlessException;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;

/**
 *
 * @author Eric Gustavo Coronel Castillo
 * @blog gcoronelc.blogspot.com
 */
public class Prueba04 extends JFrame{
  
  private JButton button;

  public Prueba04() throws HeadlessException {
    super("Demo Clásico");
    setLayout(new GridLayout(1, 1));
    setSize(200, 200);
    setLocationRelativeTo(null);
    button = new JButton("Saludar");
    add(button);
    button.addActionListener(new ActionListener() {

      @Override
      public void actionPerformed(ActionEvent e) {
        JOptionPane.showMessageDialog(rootPane, "Hola Gustavo.");
      }
    });
  }

  public static void main(String[] args) {
    Prueba04 bean = new Prueba04();
    bean.setVisible(true);
  }
  
}
     
En este caso la interface ActionListener se esta implementando como una clase anónima, a continuación tenemos su implementación utilizando expresiones lambda:

package pe.egcc.app.prueba;

import java.awt.GridLayout;
import java.awt.HeadlessException;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;

/**
 *
 * @author Eric Gustavo Coronel Castillo
 * @blog gcoronelc.blogspot.com
 */
public class Prueba05 extends JFrame{
  
  private JButton button;

  public Prueba05() throws HeadlessException {
    super("Demo Clásico");
    setLayout(new GridLayout(1, 1));
    setSize(200, 200);
    setLocationRelativeTo(null);
    button = new JButton("Saludar");
    add(button);
    button.addActionListener( (e) -> {
        JOptionPane.showMessageDialog(rootPane, "Hola Gustavo.");
      });
  }

  public static void main(String[] args) {
    Prueba05 bean = new Prueba05();
    bean.setVisible(true);
  }
  
}
   
Como se trata de un solo parámetro y una sola instrucción el código se puede reducir aún más, tal como se ilustra a continuación:

    button.addActionListener( e -> 
      JOptionPane.showMessageDialog(rootPane, "Hola Gustavo."));
       
El proyecto se puede descargar desde el siguiente enlace:
Descargar proyecto
CODIGO FUENTE - EUREKA-WEB-MYSQL-SPRING
En esta sección te presento un video de una aplicación web desarrollada SPRING FRAMEWORK y MYSQL.
Tú tienes acceso al código fuente de esta aplicación, después del video tienes el enlace.