Компиляция лямбда-выражения из строки в 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" +
"}";