usar listas lambdas interfaces expresiones explicacion example ejemplos como java lambda java-8 throw functional-interface

listas - Java lambda solo lanza estilo de expresión en lugar de estilo de declaración



java 8 lambda explicacion (2)

De la especificación de lenguaje JLS 15.27.2 :

Un cuerpo lambda es una expresión única o un bloque (§14.2).

throw no es una expresión única (es una declaración); así que tienes que usarlo en un bloque.

En Java (usando Java 8 actualmente), puedo escribir esto y todos compilarán bien:

Supplier<Long> asd = () -> { throw new RuntimeException(); };

Sin embargo, no puedo escribir esto:

Supplier<Long> asd = () -> throw new RuntimeException(); // This won''t compile :(

¿Alguien sabe por qué la implementación de Java no permite tal estilo (expresión lambda) y solo la declaración / estilo de bloque de código lambda?

Quiero decir, ya que la lambda solo está lanzando la excepción RuntimeException, ¿por qué el JDK no puede inferir la expresión lambda como:

new Supplier<Long>() { @Override public Long get() { throw new RuntimeException(); } };

¿Está esto documentado en alguna parte en las especificaciones / documentos? ¿Se agrega esto solo en JDK> 8?


Lo que escribiste es un lambda inválido. Hay una diferencia entre la expresión con los corchetes {} y sin. Vea el ejemplo. Lo siguiente significa que se devuelve 1L .

Supplier<Long> asd = () -> 1L;

que es equivalente a:

Supplier<Long> asd = () -> { return 1L; };

Sin embargo, cuando escribes:

Supplier<Long> asd = () -> throw new RuntimeException();

Se traduciría a continuación que es un lambda no válido :

Supplier<Long> asd = () -> { return throw new RuntimeException(); // invalid expression in Java };

En pocas palabras, puede comprender () -> 1L como acceso directo para { return 1L; } { return 1L; } .