miércoles, 27 de diciembre de 2017

Referencia a metodos en Java 8



Java 8 trae muchas mejoras, tal vez la más importante es que podemos utilizar clausuras o closures en ingles. Pero a la vez Java 8 trae una cantidad interesantes de métodos que utilizan esta nueva propiedad, y a la vez nos brindan mayor facilidad para resolver problemas.

La referencia del método Java 8 se usa para referirse a un método y para hacer que el programa o código sea simple o claro, puede usar la referencia al método en lugar de una expresión lambda.

En resumen esta notación abrevia la expresión lambda para llamar a cualquier método.

El operador '::' se usa como referencia de método. Veamos algunos tipos de referencias de método:
  • Referencia a un método de una instancia: object :: instanceMethod
  • Referencia a un método estático: Class :: staticMethod
  • Referencia a un método de instancia de un objeto arbitrario de un tipo particular:  Class :: instanceMethod
  • Referencia a un constructor: Class :: new
En la siguiente  imagen podemos ver la referencia y la expresión lambda que reemplaza:


Veamos unos ejemplos: 

Referencia a un método de una instancia:

@FunctionalInterface
interface Demo {
    void show();
}

public class Test {

    public void display() {
        System.out.println("I am instance method");
    }

    public static void main(String args[]) {
        Test t = new Test();
        Demo d = t :: display;//performing method reference using object
        d.show();//calling method of function interface
    }
}

Output: I am instance method


Referencia a un método estático:

@FunctionalInterface
interface Demo1 {
    void show();
}

class Test1 {
    public static void display() {
        System.out.println("Hi, i am static method of a class");
    }

    public static void main(String args[]) {
        Demo1 dd = Test1 :: display;
        dd.show();
    }
}

Output: Hi, i am static method of a class

Referencia a un método de instancia de un objeto arbitrario de un tipo particular:

import java.util.Arrays;

class Test {

    public static void main(String args[]) {
        String str[] = {"pink", "orange", "black", "red"};
        Arrays.sort(str, String :: compareToIgnoreCase);

        for(String str1 : str) {
            System.out.println(str1);
        }
    }
}

Output: black
             orange
             pink

             red

Referencia a un constructor:

interface Demo4 {
    FullName show(String s);
}

class FullName {
    FullName(String s) {
        System.out.println(s);
    }
}

class Test {
    public static void main(String args[]) {
        Demo4 d = FullName :: new;//performing constructor reference
        d.show("Anurag Singh");
    }
}


Output: Anurag Singh

Dejo link: https://docs.oracle.com/javase/tutorial/java/javaOO/methodreferences.html