A煤n no tienes acceso a esta clase

Crea una cuenta y contin煤a viendo este curso

Curso Avanzado de Java SE

Curso Avanzado de Java SE

Anah铆 Salgado D铆az de la Vega

Anah铆 Salgado D铆az de la Vega

Lambdas como variables y Recursividad

36/39
Recursos

Aportes 33

Preguntas 7

Ordenar por:

驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesi贸n.

Quiero compartir dos cosas:

  1. La notacion Dos puntos Dobles ( :: ) como ya han explicado ac谩, permite acceder a un m茅todo referenciandolo directamente desde la clase a la que pertenece, ejemplo:
import java.util.*; 
  
class GFG { 
  
    // static function to be called 
    static void someFunction(String s) 
    { 
        System.out.println(s); 
    } 
  
    public static void main(String[] args) 
    { 
  
        List<String> list = new ArrayList<String>(); 
        list.add("Geeks"); 
        list.add("For"); 
        list.add("GEEKS"); 
  
        // call the static method 
        // using double colon operator 
        list.forEach(GFG::someFunction); 
    } 
} 

En el ejemplo vemos que para llamar a la funci贸n someFunction hace uso de la clase GFG y la notaci贸n Dos puntos Dobles ( :: ) para referenciar directamente el m茅todo:

	GFG::someFunction

Esto en realidad difiere de las Lambas debido a que se vale del llamado por referencia al m茅todo previamente definido; mientras que la Lambda lo que hace es definir directamente en la sentencia lo que va a hacer el m茅todo.
.
2. La recursividad es la forma que tiene la programaci贸n funcional para crear estructuras de repetici贸n (que casi siempre son necesarias a la hora de resolver problemas), y cuenta con la enorme ventaja de facilitar la lectura y comprensi贸n del c贸digo; por ejemplo una funci贸n para calcular una sumatoria usando recursividad es tan simple y f谩cil de entender como esto:

public static int sumaN_recursivo(int n){
	return (n<=0) ? 0 : n + sumaN_recursivo(n-1);
}

Que en cambio se torna un poco m谩s compleja de entender cuando en vez de usar la recursividad usamos estructuras de bucle o iteraciones (while, for). El ejemplo anterior usando iteraci贸n queda as铆:

public static int sumaN_iterativo(int n){
	int result= 0;
	for(int i=1; i<=n; i++){
		result +=i;
	}
	return result;
}

Como se dar谩n cuenta tratar de hacer seguimiento de lo que hace el ciclo for y por tanto entenderlo resulta m谩s complejo (o al menos les tomar谩 m谩s tiempo) que el c贸digo del ejemplo de la recursividad.
.
Sin embargo existe una raz贸n muy poderosa por la que cas铆 nunca se prefiere el uso de la recursividad por sobre la interaci贸n y es el error de tipo StackOverflowError, que se debe al enorme gasto de tiempo y espacio en memoria que normalmente implica que una funci贸n se llame a s铆 misma (recursividad). Concretamente en los casos en que los datos a procesar son significativamente grandes (o se requieren muchas repeticiones del c贸digo) los c贸digos recursivos tienden a 鈥渞eventar鈥 la aplicaci贸n debido a que la 鈥淧ila de datos a trabajar Desborda la capacidad de la m谩quina鈥 o lo que es lo mismo StackOverflowError.
.
Nota: Ejemplos tomados de
https://www.geeksforgeeks.org/double-colon-operator-in-java/
http://www.clubdetecnologia.net/blog/2013/recursividad-iteracion/

Las referencias a los m茅todos nos permiten reutilizar un m茅todo como expresi贸n lambda. Para hacer uso de las referencias a m茅todos basta con utilizar la siguiente sint谩xis: referenciaObjetivo::nombreDelMetodo.
(String info) -> System.out.println(info) // Expresi贸n lambda sin referencias.
System.out::println // Expresi贸n lambda con referencia a m茅todo est谩tico.
Igualmente no me queda del todo claro.

Aqu铆 lo que se est谩 pasando es una referencia de m茅todo de una clase static mediante el operador ::

Por lo tanto lo que har谩 forEach() ser谩 aplicar ese m茅todo a cada elemento de la colecci贸n.

forEach(System.out::println)

equivale a

forEach(e -> System.out.println(e));

Muy interesante AtomicInteger para llevar el valor del indice.

En este articulo encontre la mejor explicacion de lo que son los Methods References.

Por Dios, qu茅 clase de JavaScript ES6 es este jajajaja.

Excelente clase.

Se puede llamar o utilizar metodos como referencia, es decir, usando los dos puntos, siempre y cuando, el m茅todo sea un void sin retorno.

: : es un operador de referencia de m茅todo en Java, es utilizado para llamar a un m茅todo, en este caso no especifica expl铆citamente el par谩metro en el m茅todo llamado.

Saludos,

Tengo una duda entonces el forEach solo nos permite imprimir una lista ? o puedo realizar alg煤n tipo de asignaci贸n o validaci贸n condicional ?

Muchas Gracias.

Entonces el forEach no es como en javascript que te da el value y la key? feels bad, yo pensaba que java habia mejorado pero se quedo en mitad del camino xd.

List<String> list = new ArrayList<String>();
list.add("TEXT A");
list.add("TEXT B");
list.add("TEXT C");
list.add("TEXT D");
list.add("TEXT E");
	
list.stream().filter(text -> text.contains("A")).forEach(System.out::println);
// "TEXT A"

Se llama 鈥渕茅todo de referncia鈥 y simplifica la siguiente linea de codigo

numbers.forEach(x -> System.out.println(x));

Esto quiere decir que no se necesita el nombre x para invocar println de cada uno de los elementos. Ah铆 es donde la referencia del m茅todo es 煤til: el ::operador denota que invocar谩 el printlnm茅todo con un par谩metro, cuyo nombre no especifica expl铆citamente:

numbers.forEach(System.out::println);

Fuente: https://stackoverflow.com/questions/31020269/what-is-the-use-of-system-outprintln-in-java-8?answertab=oldest#tab-top

Uno de los cambios m谩s bienvenidos en Java 8 fue la introducci贸n de expresiones lambda, ya que nos permiten renunciar a clases an贸nimas, lo que reduce en gran medida el c贸digo repetitivo y mejora la legibilidad.

Las referencias a m茅todos son un tipo especial de expresiones lambda. A menudo se usan para crear expresiones lambda simples haciendo referencia a m茅todos existentes.

Hay cuatro tipos de referencias de m茅todos:

  • M茅todos est谩ticos

  • M茅todos de instancia de objetos particulares

  • M茅todos de instancia de un objeto arbitrario de un tipo particular

  • Constructor

馃槂

Tener muy presente este tipo de objetos como AtomicInteger, son importantes en sistemas concurrentes.

muy entendible la clase y manejo de lambda el uso de los :: muy parecido a laravel en los llamados de m茅todos de las clases

No entend铆 muy bien lo de ::

Me pueden apoyar por favor?

Gracias!

Se da por entendido no? Ya que al momento de estar trabajando con FP no estamos utilizando las iteraciones

AtomicInteger para los 铆ndices de la lista, mas informaci贸n https://stackoverflow.com/questions/4818699/practical-uses-for-atomicinteger

Realmente no entiendo la sintaxis del codigo que muestran al principio

No entiendo porque no se puede hacer iteraciones ni assignaciones en las lambdas, yo lo hago en en mi codigo y no hay ningun problema. No se puede o no es recomendable? Sabeis porque no deberia?

Segun la maestra en el minuto 2:30 es posible crear lambdas a partir de clases abstractas con un solo metodo abstracto, pero eclipse me marca error diciendo que debe ser a fuerzas una functional interface. Lo mismo encontre investigando en google. Hay una manera de hacer esto con clases abstractas?

Ejemplo de c贸digo sin lambda:

mButton.setOnClickListener( new View.OnClickListener(){} );

En el ejemplo anterior se resaltan en Negritas las funciones para ilustrar la frase: Una funci贸n que recibe otra funci贸n

Con Lambdas se Ahorra Codigo鈥!!

los :: es una abreviacion, y significa que recorrera los todos los elementos de una coleccion, en el caso del ejemplo, los imprimira.

Tengo una duda entonces la expresi贸n Foreach(System.out::println) , solo nos permite imprimir todo el objeto.

Si entendi bien, los dos puntos :: hacen que:

  • se sobre entiende que se recibe un parametro.

  • permite mandar este parametro a la funcion siguiente, en este caso println.

No me quedo 100% claro pero si trato de explicarlo en mis palabras seria que utilizando los dos puntos, el metodo System.out.println sera llamado con el parametro recibido del foreach, sin tener que especificar el parametro ni la utilizacion de este. Es decir, solamente tendriamos que escribir con los dos puntos la funcion que nosotros queremos que se ejecute cada vez que el foreach nos da un resultado y que al mismo tiempo es el parametro de la funcion.

Notas: AtomicInteger atomicInteger = new AtomicInteger(1);
atomicInteger.getAndIncrement();
Excelente explicaci贸n, nuevo tema aprendido de los AtomicIntegers

Genial 馃槂

1 鈥榝or鈥 ambiguo y dos 鈥榝oreach鈥 que hacen exactamente lo mismo, pero con recursividad.

Es algo llamado 鈥渕ethod reference鈥 y llamas a la funci贸n System.out.println con un par谩metro que no espec铆ficas.

porque le estamos pasando la funci贸n, para que internamente forEach la llame pasando le cada elemento.

es otra forma de poder imprimir un listado.