Компиляция лямбда-выражения из строки в Janino

Я пытаюсь скомпилировать класс из String с помощью Janino. Класс содержит лямбда-выражение внутри функции, но, похоже, не распознает ссылочные операторы "->" и "::".

Я получаю CompileException. Исключение полной трассировки ставки в потоке main org.codehaus.commons.compiler.CompileException: строка 1, столбец 346: неожиданный токен ">" в основном

Ниже приведен код, который я использую,

public class LambdaFromJanino{

      public static void main(String[] args) throws Exception
        {
            String CLASS_NAME = "Foo";
            String codeStr = "import java.util.Arrays;" + 
                        "import java.util.List;"+
                        "import java.util.stream.Collectors;"+
                        "public class " + CLASS_NAME + " {" +
                        "public static void main(String[] args) {" +
                        "System.out.println(\"Hello \" + args[0]);" +
                        "List<String> result = lambdaOut(args);"+
                        //"result.forEach(System.out::println);"+
                        "System.out.println(\"this is result \"+result.get(0));"+
                        "}" +
                        "static List lambdaOut(String[] arr)  {  " +
                        "return  Arrays.stream(arr).map( x -> x.replaceAll(\"[a-zA-Z]\", \"\"))" +
                        ".collect(Collectors.toList()); }; " +
                        "}";
            SimpleCompiler compiler = new SimpleCompiler();
            compiler.cook( codeStr ); // compile the string
            // get the loaded class
            Class<?> cl = compiler.getClassLoader().loadClass(CLASS_NAME);
            // Invoke the "public static main(String[])" method
            Method mainMeth = cl.getMethod("main", new Class[] { String[].class });
            String[] methArgs = new String[] { args[0], args[1], args[2] }; // one input
            mainMeth.invoke(null, new Object[] { methArgs });
        } 
}

1 ответ

Попробуйте приведенный ниже код, это поможет решить вашу проблему.

Поскольку вы не собираете результат, я лямбда-выражение, здесь я прикрепил \"\")).collect(Collectors.toList())\n" чтобы решить эту проблему.

    public static void main(String[] args) throws Exception
                {
                    String CLASS_NAME = "Foo";
                    String codeStr = "import java.util.Arrays;" + 
                                "import java.util.List;"+
                                "import java.util.stream.Collectors;"+
                                "public class " + CLASS_NAME + " {" +
                                "public static void main(String[] args) {" +
                                "System.out.println(\"Hello \" + args[0]);" +
                                "List<String> result = lambdaOut(args);"+
                                //"result.forEach(System.out::println);"+
                                "System.out.println(\"this is result \"+result.get(0));"+
                                "}" +
                                "static List lambdaOut(String[] arr)  {  " +
"return  Arrays.stream(arr).map( x -> x.replaceAll(\"[a-zA-Z]\", \"\")).collect(Collectors.toList())\n" +
                    ".collect(Collectors.toList()); }; \n" +
                    "}";
Другие вопросы по тегам