variable lambdas expresiones explicacion example ejemplos java lambda java-8

lambdas - java 8 lambda variable



¿Cuándo son las llaves opcionales en la sintaxis lambda de Java 8? (4)

Me doy cuenta de que la implementación lambda de Java 8 está sujeta a cambios, pero en la compilación b39 de lambda, he descubierto que las llaves solo se pueden omitir cuando la expresión lambda devuelve un tipo no vacío. Por ejemplo, esto compila:

public class Collections8 { public static void main(String[] args) { Iterable<String> names = Arrays.asList("Alice", "Bob", "Charlie"); names.filter(e -> e.length() > 4).forEach(e -> { System.out.println(e); }); } }

Pero quitando las llaves como esta:

names.filter(e -> e.length() > 4).forEach(e -> System.out.println(e));

da el error

Collections8.java:6: error: method forEach in interface Iterable<T> cannot be applied to given types; names.filter(e -> e.length() > 4).forEach(e -> System.out.println(e)); ^ required: Block<? super String> found: lambda reason: incompatible return type void in lambda expression where T is a type-variable: T extends Object declared in interface Iterable

¿Alguien puede explicar lo que está pasando aquí?


Esto acaba de llegar: el EG (en su mayoría) ha tomado una decisión sobre la sintaxis.

Después de considerar varias alternativas, decidimos adoptar esencialmente la sintaxis de C #. Es posible que sigamos deliberando sobre los puntos finos (p. Ej., Flecha delgada contra flecha gruesa, forma especial de nilary, etc.) y aún no hayamos tomado una decisión sobre la sintaxis de referencia del método.

La sintaxis de C # es:

lambda = ArgList Arrow Body ArgList = Identifier | "(" Identifier [ "," Identifier ]* ")" | "(" Type Identifier [ "," Type Identifier ]* ")" Body = Expression | "{" [ Statement ";" ]+ "}"

Una expresión evalúa algo, no puedes tener expresiones vacías en Java. Es una declaración, por lo tanto necesitas {} alrededor de ella.

http://mail.openjdk.java.net/pipermail/lambda-dev/2011-September/003936.html


He probado su código y para la versión más actualizada de JRE creo que estaría bien.

Lo siguiente es lo que hago referencia a documentos Java de Oracle.

En una expresión lambda, debe incluir instrucciones entre llaves ( {} ). Sin embargo, no tiene que incluir una invocación de método void entre llaves.
Por ejemplo, la siguiente es una expresión lambda válida:

email -> System.out.println(email)

Y la doctora lo explica con bastante claridad. Espero que esto pueda resolver su problema.

Referencias: https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html


Puede omitir las llaves cuando el cuerpo lambda sea una expresión única o una invocación del método nulo. Cada expresión se evalúa como un valor y, por lo tanto, no se puede anular.

Si el cuerpo de la lambda es un bloque de declaraciones (por ejemplo, una serie de cálculos seguidos por una declaración de return ), o la lambda no tiene ningún valor (es decir, tiene un tipo de devolución void ) y no es una invocación de método de nula, debe usar La forma de bloque, que requiere corchetes.

En un lambda de estilo de bloque, si se return un valor a ed, entonces todas las rutas de código posibles deben return un valor o throw un Throwable .


Si no hay llaves, la lambda devuelve automáticamente una expresión después del operador ->.
Por lo tanto, cuando tienes un lambda que no devuelve nada, debes usar las llaves