Interfaces Funcionales Genéricas

Avanzado

Una expresión lambda, en sí misma, no puede especificar parámetros de tipo. Por lo tanto, una expresión lambda no puede ser genérica. (Por supuesto, debido a la inferencia de tipo, todas las expresiones lambda exhiben algunas cualidades “genéricas”). Sin embargo, la interfaz funcional asociada con una expresión lambda puede ser genérica. En este caso, el tipo de objetivo de la expresión lambda se determina, en parte, por el argumento de tipo o los argumentos especificados cuando se declara una referencia de interfaz funcional.

1. Ejemplo de Interfaces Funcionales Genéricas

Para comprender el valor de las interfaces funcionales genéricas, considere lo siguiente. Anteriormente en esta sección, se crearon dos interfaces funcionales diferentes, una llamada PruebaNum y la otra llamada PruebaString. Se usaron para determinar si dos valores satisfacían alguna condición. Para hacer esto, ambos definieron un método llamado prueba() que tomó dos parámetros y devolvió un resultado booleano. En el caso de PruebaNum, los valores que se probaron fueron enteros. Para PruebaString, los valores eran de tipo String.

Por lo tanto, la única diferencia entre los dos métodos era el tipo de datos que operaban. Tal situación es perfecta para los genéricos. En lugar de tener dos interfaces funcionales cuyos métodos difieren solo en sus tipos de datos, es posible declarar una interfaz genérica que se puede usar para manejar ambas circunstancias. El siguiente programa muestra este enfoque:

// Uso de una interfaz funcional genérica.

// Una interfaz funcional genérica con dos parámetros q
// que devuelve un resultado booleano.

interface Prueba<T>{
    boolean prueba(T n, T m);
}
class InterfFuncionalGenDemo {
    public static void main(String[] args) {

        // Esta expresión lambda determina si un integer es divisor de otro.
        Prueba<Integer> esDivisible = (n,d) -> (n%d)==0;

        if (esDivisible.prueba(10,2))
            System.out.println("2 es divisor de 10");
        System.out.println();

        // La siguiente expresión lambda determina si un double es divisor de otro.
        Prueba<Double> esDivisibleD = (n,d) -> (n%d)==0;

        if (esDivisibleD.prueba(200.0,4.0))
            System.out.println("4.0 es divisor de 200.0");
        System.out.println();

        // Esta expresión lambda determina si un string es parte de otro.
        Prueba<String> esParte = (a,b) -> a.indexOf(b)!= -1;

        String str="Interfaz Funcional Generica";
        System.out.println("Probando string: "+str);

        if (esParte.prueba(str,"cio"))
            System.out.println("'cio' es parte");
         else System.out.println("'cio' NO es parte");
    }
}

Salida:

2 es divisor de 10

4.0 es divisor de 200.0

Probando string: Interfaz Funcional Generica
'cio' es parte

En el programa, la interfaz funcional genérica Prueba se declara como se muestra aquí:

interface Prueba<T>{
boolean prueba(T n, T m);
}

Aquí, T especifica el tipo de ambos parámetros para prueba(). Esto significa que es compatible con cualquier expresión lambda que tome dos parámetros del mismo tipo y devuelva un resultado tipo boolean.

La interfaz Prueba se usa para proporcionar una referencia a tres tipos diferentes de lambdas. El primero usa tipo Integer, el segundo usa tipo Double y el tercero usa tipo String. Por lo tanto, la misma interfaz funcional se puede usar para referirse a esDivisible, esDivisibleD y esParte lambdas. Solo el argumento de tipo pasado a Prueba difiere.

Expresiones Lambda en Java
  • Interfaces Funcionales Genéricas

Sobre el Autor:

Hey hola! Yo soy Alex Walton y tengo el placer de compartir conocimientos hacía ti sobre el tema de Programación en Java, desde cero, Online y Gratis.

Deja una Respuesta

*

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.