Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

[Dúvida] Lambda cannot redeclare

Fiz um teste de Strings diferente, fora do exercicio com Contas e Clientes, e vi um erro inesperado com o Lambda: Lambda expression's parameter cannot redeclare another local variable defined in an enclosing scope

public class TesteStringComparator {

    public static void main(String[] args) {

        String nome1 = "Nair";
        String nome2 = "Andre";
        String nome3 = "Roberto";
        String nome4 = "Maria";

        List<String> lista = new ArrayList<>();
        lista.add(nome1);
        lista.add(nome2);
        lista.add(nome3);
        lista.add(nome4);

        for (String nomes : lista) { 
            System.out.println(nomes);
        }

        // !!! AQUI OCORRE O ERRO AO USAR NOME1/NOME2 !!!
        // lista.sort((String nome1, String nome2) -> { 
        //         return nome1.compareTo(nome2);
        //     }
        // ); 

        // MUDANDO O PARAMETRO PARA N1/N2 O CODIGO COMPILA
        lista.sort((String n1, String n2) -> { 
                return n1.compareTo(n2);
            }
        ); 

        System.out.println("------");

        for (String nomes : lista) {  
            System.out.println(nomes);
        }
    }
}
2 respostas
solução!

Bom dia André!

Esse erro, basicamente fala que você está tentando declarar um parâmetro com o mesmo nome de uma variável que já existe no escopo externo.

No código você tem uma variável chamada "nome1" e "nome2", declaradas no escopo principal do método main(), e está tentando usar elas como parâmetros na expressão lambda redeclarando elas, sendo essa a causa do erro pois essas variáveis estão disponíveis para a expressão lambda, e a mesma não pode redeclará-las.

 String nome1 = "Nair";
 String nome2 = "Andre";

/*...*/

 lista.sort((String nome1, String nome2) -> { 
      return nome1.compareTo(nome2);
         }
  ); 

Para resolver esse problema, você pode mudar o nome dos parâmetros da expressão lambda pra evitar a redeclaração de variáveis. Como você fez na segunda chamada à função sort(), modificando os nomes das variáveis.

lista.sort((String n1, String n2) -> { 
      return n1.compareTo(n2);
          }
  ); 

Obrigado!