Avatar billede kernelx Juniormester
19. april 2017 - 10:12 Der er 1 kommentar

Lambda uden fix interface og med annotation arguments

Hi,

jeg har foelgende klasser:
---
public class MyFunctionManager {
    public void addFunction(Object action) {
        // ...
    }
}
---
public class MyApp {

    public void registerFunctions() {
        final MyFunctionManager myFunctionManager = new MyFunctionManager();

        myFunctionManager.addFunction(new Object() {
            public void doSomething(
                    @Arg("op1") Integer op1,
                    @Arg("op2") Integer op2) {
                System.out.println("result: " + (op1 + op2));
            }
        });

        myFunctionManager.addFunction(new Object() {
            public void doSomething(
                    @Arg("op1") Integer op1,
                    @Arg("op2") Integer op2,
                    @Arg("op3") Integer op3) {
                System.out.println("result: " + (op1 * op2 * op3));
            }
        });
    }
}
---

Mit problem er, at jeg altid er noedt til at lave en ny instance a Object for at vaere i stand til at wrappe min function.

Er det muligt at faa ovenstaaende eksempel til noget der ligner lambda expressions, som i foelgende eksempel?

---
public class MyApp {

    public void registerFunctions() {
        final MyFunctionManager myFunctionManager = new MyFunctionManager();

        myFunctionManager.addFunction((
                @Arg("op1") Integer op1,
                @Arg("op2") Integer op2) -> {
            System.out.println("result: " + (op1 + op2));
        });

        myFunctionManager.addFunction((
                @Arg("op1") Integer op1,
                @Arg("op2") Integer op2,
                @Arg("op3") Integer op3) -> {
            System.out.println("result: " + (op1 * op2 * op3));
        });

    }
}
---
Avatar billede arne_v Ekspert
19. april 2017 - 15:30 #1
Lambda virker kun naar der er et functional interface hvor signatur kan matche.

Jeg tror ikke at det kan laves ligesaa generelt som din kode.

Med nogle yderlige restriktioner kan man lave:


public class FunctionFun {
    public static @interface Arg {
        public String value();
    }
    @FunctionalInterface
    public static interface Func1 {
        public void doSomething(Integer a1);
    }
    @FunctionalInterface
    public static interface Func2 {
        public void doSomething(Integer a1, Integer a2);
    }
    @FunctionalInterface
    public static interface Func3 {
        public void doSomething(Integer a1, Integer a2, Integer a3);
    }
    public static class MyFunctionManager {
        public void addFunction(Func1 action) {
        }
        public void addFunction(Func2 action) {
        }
        public void addFunction(Func3 action) {
        }
    }
    public static void main(String[] args) {
        final MyFunctionManager myFunctionManager = new MyFunctionManager();
        myFunctionManager.addFunction((@Arg("op1") Integer op1, @Arg("op2") Integer op2) -> {
            System.out.println("result: " + (op1 + op2));
        });
        myFunctionManager.addFunction((@Arg("op1") Integer op1, @Arg("op2") Integer op2, @Arg("op3") Integer op3) -> {
            System.out.println("result: " + (op1 * op2 * op3));
        });
    }
}


Her kan den matche med Func1, Func2, Func3.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester