Buscar
Social
Ofertas laborales ES

Foro sobre Java SE > Ejemplo fallido con Lambdas

Buenas, he estado viendo lo nuevo de Java 8 y poniendo en practica los Lambdas...
pero, no consiguo entender lo siguiente:

Interfaz:

@FunctionalInterface
interface Jugar{

public abstract void resultado( int a, int b );
}


Clase:

class test{

public static void main(String[] args) {

Jugar jugar = (int x,int y) -> System.out.println("El resultado de x + y es: " + x+y);

jugar.resultado();
}
}


El caso, es que me gustaria poder ejecutarlo en la linea: jugar.resultado();

pero me pide argumentos(es obvio, por que asi la firma lo dice), pero se supone que ya se los pase anteriormente, y si se los doy, no lo entenderia por que ya se los pase antes...

que tendria que cambiar, ya sea en el metodo de la interfaz o en la expresion lambda para que pueda ejecutar ese fragmento??

gracias!

septiembre 11, 2015 | Unregistered CommenterAlbert

Hola Albert, creo que has entendido mal, lo que haces con la expresión lambda, es definir lo que hace el método resultado, para ejecutarlo debes llamarlo y mandarle los parámetros que has definido.

para llamarlo como lo haces tu pero con los parametros supongamos x=3 y y=4

jugar.resultado(3,4);
que por cierto imprimiría El resultado de x + y es: 34, porque como el primer + es concatenación java te entiende que el segundo tambien, esto es por la precedencia y asociatividad de operadores, el signo + como contaminación tiene la misma precedencia que el signo + para suma, y como se ejecuta de izquierda a derecha, pues adivinaste concatena x a la cadena, y cuando ejecuta el segundo + no le toca otra que interpretarlo como contaminación dado que su otro operador ya es una cadena.
para evitarlo usa los paréntesis para darle mas precedencia a la operación suma y así se ejecutara primero

Jugar jugar = (int x,int y) -> System.out.println("El resultado de x + y es: " + (x+y));

jugar.resultado(5,4);

ahora si imprimirá: El resultado de x + y es: 9.

espero verte aclarado.

pd: anteriormente si lambda, lo equivalente seria con clases anónimas
así:

Jugar jugar=new Jugar(){
public void resultado(int x,int y){
System.out.println("El resultado de x + y es: " + (x+y));
}

};


jugar.resultado(3,4);

//esto es lo que hace tu expresión lambda definir tu metodo resultado.

septiembre 12, 2015 | Unregistered Commenterjhosep

ohh, mil gracias!
si es que habia olvidado ponerle valores xd


otra pregunta, muy rapida, en caso de que el metodo devuelva un valor, por ejemplo un int, yo he hecho algo asi:

@FunctionalInterface
interface Jugar{

public abstract int resultado( int a, int b );
}

class test{

public static void main(String[] args) {

Jugar jugar = (int x,int y) ->{
return x+y;
};


int j = jugar.resultado(5,4);

System.out.println(j);
}
}

Pero, me parece un poco redundante el hecho de llamar al lambda, y luego asignarle a este un valor.
No hay una forma mas directa de asignarselo a la variable j, directamente desde el llamamineto Jugar?

algo tipo asi:

int j = Jugar.resultado(x,y)...

gracias

septiembre 12, 2015 | Unregistered CommenterAlbert

hola, poniendo un poco más simple los lambda son definiciones anónimas de métodos, y solo son eso definiciones, no se ejecutan.

Creo que tu quisieras hacer esto.
Jugar jugar = (int x=4,int y=5) ->{
return x+y;
};

int j=jugar.resultado();

System.out.println(j);//j=9

aunque eso ya seria mas valores por default de parametros (que de hecho aun no existe en java) que por lambda.

aunque si podes simular el comportamiento así:
//principal
public class Test {
public static void main(String[] args) {
Jugar jugar = (int x, int y) -> x+y;//como solo es un retorno lo puedes colocar asi

int j=jugar.resultado();
System.out.println(j);//imprimira 9
}
}

@FunctionalInterface
interface Jugar{

public abstract int resultado( int a, int b );

public default int resultado(){
return resultado(5,4);//aqui cargas tus parametros por defecto.
}
}

Espero que te ayude, nos cuentas.

saludos

septiembre 12, 2015 | Unregistered Commenterjhosep

Entendido!!
muchas gracias

septiembre 16, 2015 | Unregistered CommenterAlbert