Operador "::"
Operador “::” también llamado “referencia del método” surgió a partir de Java 8, nos sirve para abreviar expresiones lambda entre otras funcionalidades. Por ejemplo:
Comparator x = (c1, c2) -> ((Computer) c1).getAge().compareTo(((Computer) c2).getAge());
Comparator c = Comparator.comparing(Computer::getAge);
//Expresiones identicas
a -> System.out.println(a)
System.out::println
Sintaxis: “::”
Como podéis obsevar con este operador accedemos a un método de la clase ya implementado. Este operador ya lo hemos utilizado con ficheros con lambda por ejemplo accediendo a println.
Posibilidades de uso
Acceso a métodos estáticos de una clase
Clases de ejemplo para probar lo siguiente: Computer.java, ComputerUtils.java y OrdenadorHijo.java
Ejemplo:
List <Computer> inventory = Arrays.asList(
new Computer( 2015, "white", 35), new Computer(2009, "black", 65));
inventory.forEach(ComputerUtils::repair);
Acceso a método normales de un objeto
Computer c1 = new Computer(2015, "white");
Computer c2 = new Computer(2009, "black");
Computer c3 = new Computer(2014, "black");
Arrays.asList(c1, c2, c3).forEach(System.out::print);
Uso con herencia
Método de la superclase:
public Double calculateValue(Double initialValue) {
return initialValue/1.50;
}
Método sobreescrito en clase hija:
@Override
public Double calculateValue(Double initialValue){
Function<Double, Double> function = super::calculateValue;
Double pcValue = function.apply(initialValue);
return pcValue + (initialValue/10) ;
}
Llamar al constructor
Con la palabra new podemos ejecutar el constructor de una clase:
class GFG {
// Class constructor
public GFG(String s)
{
System.out.println("Hello " + s);
}
// Driver code
public static void main(String[] args)
{
List<String> list = new ArrayList<String>();
list.add("Geeks");
list.add("For");
list.add("GEEKS");
// call the class constructor
// using double colon operator
list.forEach(GFG::new);
}
}
Ejercicio 1
Crea una lista de nombres, ordénalos (por longuitud) y muéstralos por pantalla usándo lambda y el operador ::