Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

216
Visualizações
¿Cómo puedo evitar el error de cumplimiento "la expresión lambda debe ser final o efectivamente final", si quiero aplicar diferentes acciones en diferentes estados?

Por ejemplo, tengo dos clases tan simples como sea posible, A y B, quiero tomar alguna acción en los objetos de B, si se cambia algún campo específico del objeto A, debo hacer una cosa, si se cambia algún otro campo, debo hacer la segunda cosa, ¿Cómo puedo hacer eso con Lambda?

UN:

 public class A { private int someField; private String nextField; public A(int someField, String nextField) { this.someField = someField; this.nextField = nextField; } public int getSomeField() { return someField; } public void setSomeField(int someField) { this.someField = someField; } public String getNextField() { return nextField; } public void setNextField(String nextField) { this.nextField = nextField; } }

B:

 public class B { private String someField; public String getSomeField() { return someField; } public void setSomeField(String someField) { this.someField = someField; } public B(String someField) { this.someField = someField; } }

Manifestación:

 public class Demo { public static <T> boolean isFieldChanged(T oldValue, T newValue) { return !Objects.equals(oldValue, newValue); } public static void someActionOne(B test){ return; } public static void someActionTwo(B test){ return; } public static void main(String[] args) { A oldData = new A(35, "old"); A clientData = new A(25, "ClientData"); Consumer<B> action = null; if (isFieldChanged(oldData.getNextField(), clientData.getNextField())) { action = Demo::someActionOne; } else if (isFieldChanged(oldData.getSomeField(), clientData.getSomeField())) { action = Demo::someActionTwo; } List<B> mockData = new ArrayList<>(Arrays.asList(new B("test1"), new B("test2"))); mockData.forEach(b -> action.accept(b)); } }

¿Cómo puedo evitar el error de compilación en ese caso?

over 4 years ago · Santiago Trujillo
1 Respostas
Responde à pergunta

0

Para ser efectivamente final, una variable no debe cambiarse después de la inicialización.

Si desea utilizar diferentes acciones, simplemente inicialícelas dos veces:

 public static void main(String[] args) { A oldData = new A(35, "old"); A clientData = new A(25, "ClientData"); List<B> mockData = new ArrayList<>(Arrays.asList(new B("test1"), new B("test2"))); if (isFieldChanged(oldData.getNextField(), clientData.getNextField())) { mockData.forEach(Demo::someActionOne); } else if (isFieldChanged(oldData.getSomeField(), clientData.getSomeField())) { mockData.forEach(Demo::someActionTwo); } }
over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda