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.



No hay comentarios:

Publicar un comentario