Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

204
Vistas
How can I avoid complie error "lambda expression should be final or effectively final", if I want to apply different actions under different state?

For example I have two simple as possible classes, A and B I want to take some action on objects of B, if some specific field of A object is changed I should do one thing, If some other field is changed I should do second thing, how can I do that with Lambda?

A:

 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;
    }
}

Demo:

 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));
        }
    }

How can I avoid compile error in that case?

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

To be effectively-final, a variable must not be changed after initialization.

If you want to use different actions, just initialize them twice:

    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 Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda