¿Por qué no para-cada método en Java no lanzar una excepción cuando un argumento de tipo de función se pasa en lugar de consumidor?

Sudhanshu Jaisani:

¿Por qué no forEachel método en Java no muestra un error de compilación cuando un argumento de tipo de función se pasa en lugar de consumidor? Aquí las dos líneas están regresando un valor booleano para cada elemento en la corriente pero sólo 2ª línea obtiene un error de compilación? ¿Hay alguna otra propiedad de expresión lambda para tal escenario?

Aquí está mi código:

Stream.of(1,2,3,4).forEach(a->a.equals(1));//line 1

Stream.of(1,2,3,4).forEach(a->{return a.equals(1);});//line 2
ernest_k:

En cuanto a por qué las primeras líneas de las obras: hay una explicación de la especificación :

En términos generales, un lambda de la forma () -> expr, donde expres una expresión declaración, se interpreta como () -> { return expr; }o () -> { expr; }, dependiendo del tipo de objetivo.

Lo anterior viene con el siguiente ejemplo (buena coincidencia, esto es muy similar a su ejemplo):

// Consumer has a void result
java.util.function.Consumer<String> c = s -> list.add(s);

Esto simplemente significa que el compilador ignora el tipo de cambio de la expresión, como si el código fuera simplemente esto (que es válido para un método void):

Stream.of(1, 2, 3, 4).forEach(a -> {
     a.equals(1);
});

Y con respecto a la segunda línea, la especificación dice:

Un cuerpo de bloque lambda es compatible con nula si cada instrucción de retorno en el bloque tiene la forma return;.

En su caso, sin embargo, {return a.equals(1);}no cumple con esta regla. Métodos nulas no devuelven un valor.

Una manera fácil de entender esto es considerar que el compilador se aplica reglas de validación cuerpo del método (de tal manera que el cuerpo debe ser compatible con la declaración public void accept(T t)) - como se menciona en el tutorial

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=201986&siteId=1
Recomendado
Clasificación