3
respostas

Como ficaria certo?

O que eu poderia alterar na linha A para que o código compilasse e imprimisse 1?

3 respostas

Olá, Vitor.

Tudo bem?

Para que o código compile e imprima 1, você precisa resolver o problema na linha A. O problema ocorre porque a variável a está sendo usada duas vezes com significados diferentes: uma como parâmetro do método method e outra como a variável do lambda.

Para corrigir isso, você pode renomear a variável do lambda para algo diferente, por exemplo, b. Veja como ficaria o código:

import java.util.function.Predicate;

class A {
    int a = 0;

    public static void main(String[] args) {
        new A().method(1);
    }       

    private void method(int a) {
        Predicate<Integer> d = b -> b > 0; // A
        
        if(d.test(a)){ // B
            System.out.println(a);
        }
    }
}

Dessa forma, o código compilará corretamente e imprimirá 1, pois o valor passado para o método method é 1 e a condição b > 0 será verdadeira.

Não esqueça de importar o predicate com o código: import java.util.function.Predicate;.

Espero ter ajudado e bons estudos!

Então o "b" é só pra dizer a condição do lambda, não faz diferença a variável escolhida desde que não cause o problema que causou quando era "a" já que na hora do d.test(a) ele substitui o "b" pelo "a" para veerificar a condição, certo?

Olá, Vitor!

Exatamente isso!

A variável b que você usa no lambda é apenas um "nome temporário" dentro da expressão lambda. Ela representa o valor que será testado dentro do lambda, mas não interfere no valor que está fora do lambda ( é o parâmetro a do método). O que acontece no lambda fica isolado, então você pode escolher qualquer nome que não cause conflito.

Quando você chama d.test(a), o valor de a (que é o parâmetro do método) é passado para o lambda, e o lambda vai verificar se esse valor atende à condição b > 0. Nesse caso, o b representa o valor de a dentro do contexto do lambda, e como a vale 1, o teste passa e imprime 1.

Respondendo sua pergunta, sim, nome da variável dentro do lambda pode ser qualquer um, contanto que não entre em conflito com outros nomes no escopo do método!

Espero que isso esclareça! Bons estudos!