¿Para que sirven los :: en Java?

¿Para que sirven los :: en Java? . Esta es una pregunta muy recurrente para mucha gente que empieza formarse con programación funcional en el lenguaje. El operador :: o de doble dos puntos es un operador muy habitual en programación funcional que hace referencia a como aumentar la reutilización de una expresión lambda o función.

Java y funciones

Vamos a ver un ejemplo sencillo de como utilizarle. Para ello imaginémonos que disponemos de una lista de numeros y queremos sumarlos con programación funcional a través de un stream. La operación más sencilla antes de sumarlos es simplemente mostrarlos .

package com.arquitecturajava;

import java.util.Optional;
import java.util.stream.Stream;

public class Principal2 {

 public static void main(String[] args) {

  Stream<Integer> lista = Stream.of(5, 7, 2, 1);

  lista.forEach((n)->System.out.println(n));

 }

}

Hemos recorrido con una operación foreach todos los elementos

Java y Reducciones

Ahora podemos acceder a otra operación más avanzada que en vez de recorrerlos los sume. Esta operación es conocida como una operación de reducción y permite aplicar una función a un flujo o stream de datos para obtener un único resultado final . Vamos a hacerlo en código:

                Stream<Integer> lista = Stream.of(5, 7, 2, 1);

  Optional<Integer> oResultado = lista.reduce((numero1, numero2) -> numero1 + numero2);

  if (oResultado.isPresent()) {

   System.out.println(oResultado.get());
  }

Esto imprimirá el resultado :

15

Esta claro que esta operación simplifica mucho y podemos construir un código mucho más limpio que suma todos . Sin embargo una operación de reducción hay que definirla para cada grupo de datos que manejamos esto implica generar mas funciones cada vez que realicemos una suma.

Usando :: en Java

Para simplificar esta operación a nivel de Java podemos en vez de definir una operación de reducción . Referenciar a otra función que ya exista en alguna clase que construyamos o en alguna clase que aporte el JDK. En este caso al tratarse de una operación tan sencilla ese método existe ya en el JDK y pertenece a la clase Integer . Concretamente el método sum (a,b) que permite sumar dos elementos .

Por lo tanto podemos simplificar todavía las cosas más y sumar los dos elementos que tenemos usando un método de referencia sin tener que añadir código extra usando :: en Java y referenciando el método existente.

                Stream<Integer> lista2 = Stream.of(5, 7, 2, 1);
  Optional<Integer> oResultado2 = lista2.reduce(Integer::sum);

  if (oResultado2.isPresent()) {

   System.out.println(oResultado.get());
  }

Usemos más los métodos de referencia usando el operador :: .

Otros artículos relacionados