El JLS especifica que
Si el resultado del tipo de función es nulo, el cuerpo lambda es una expresión de declaración (§14.8) o un bloque compatible con void.
Ahora veamos eso en detalle,
Dado que su takeBiConsumer
método es de tipo vacío, la lambda que recibe new String("hi")
lo interpretará como un bloque como
{
new String("hi");
}
que es válido en un vacío, de ahí el primer caso compilado.
Sin embargo, en el caso donde está la lambda -> "hi"
, un bloque como
{
"hi";
}
no es una sintaxis válida en java. Por lo tanto, lo único que se puede hacer con "hola" es intentar devolverlo.
{
return "hi";
}
que no es válido en un vacío y explique el mensaje de error
incompatible types: bad return type in lambda expression
java.lang.String cannot be converted to void
Para una mejor comprensión, tenga en cuenta que si cambia el tipo de takeBiConsumer
a String, -> "hi"
será válido ya que simplemente intentará devolver directamente la cadena.
Tenga en cuenta que al principio pensé que el error se debió a que lambda estaba en un contexto de invocación incorrecto, por lo que compartiré esta posibilidad con la comunidad:
JLS 15.27
Es un error en tiempo de compilación si una expresión lambda ocurre en un programa en algún lugar que no sea un contexto de asignación (§5.2), un contexto de invocación (§5.3) o un contexto de conversión (§5.5).
Sin embargo, en nuestro caso, estamos en un contexto de invocación que es correcto.