java - features - 'Regra especial de compatibilidade de vazios' da Lambda-expressão de instrução



java lambda definition (2)

Estou lendo o Java 8 em ação. Na seção 3.5.2 há um parágrafo sobre 'regra de compatibilidade de void':

Se um lambda tem uma expressão de instrução como seu corpo, ele é compatível com um descritor de função que retorna void (desde que a lista de parâmetros seja compatível também). Por exemplo, as duas linhas a seguir são válidas, mesmo que o método add de uma lista retorne um valor booleano e não vazio como esperado no contexto do consumidor (T -> void):

// Predicate has a boolean return 
Predicate<String> p = s -> list.add(s); 
// Consumer has a void return 
Consumer<String> b = s -> list.add(s);

Como você descreveria a expressão "declaração" em geral? Eu pensei que era uma declaração ou expressão. Além disso, essa regra de compatibilidade de vazios não é 100% clara para mim, você pode pensar em algum outro exemplo?

https://src-bin.com


Answer #1

É explicado no post anterior claramente ... Estou tentando no meu caminho !!!

Um descritor de função com valor de retorno explícito pode ser fornecido para um descritor de função lambda que não retorna nenhum valor.

Por exemplo, Predicado T -> vs Consumer T -> void expressão lambda que recebe uma entrada e dá booleano como retorno, Predicado, pode ser fornecido para o Consumidor.

No exemplo a seguir, public boolean add (Ee) {} retorna booleano, mas ele pode ser usado no lambda para Consumer, que retorna void.

    Predicate<String> p = s -> list.add(s);
    p.test("helloworld"); // this returns boolean 

    Consumer<String> consumerExample = s -> list.add(s);
    consumerExample.accept("Welcometokpm"); // this returns void

Answer #2

A estrutura comum da expressão lambda é que:

(parameter) -> {body};

{body} com uma declaração de retorno de declaração de linha única é opcional, por exemplo

Predicate<String> p = s -> list.add(s);

Quando chaves são usadas, a declaração de retorno torna-se obrigatória, por exemplo

Predicate<String> p = s -> { return list.add(s);};

Agora, considere uma Interface Funcional como Consumidor com um método abstrato que não retorna nenhum valor. Ele pode aceitar uma instrução que retorna qualquer valor, porque o compilador ignora a instrução de retorno para tais métodos abstratos.

E, portanto, as afirmações abaixo são verdadeiras:

Consumer<String> b = s -> list.add(s);

Equivalente a:

Consumer<String> consumerExample = s -> {list.add(s);};

Abaixo da linha está incorreta:

Consumer<String> consumerExample = s -> {return list.add(s);};

Portanto, se um lambda tiver expressão de instrução como seu corpo, ele é compatível com um descritor de função que retorna void (desde que a lista de parâmetros seja compatível também) .





java-8