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.
Esta pregunta ya tiene una respuesta aquí:
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; }
.