我希望在Java代码中使用groovy从字符串值计算数学表达式。我创建了如下所示的Groovy脚本:
def sum(List<MyObject> myObjList) {
int sum =0
myObjList.each {it -> sum += it.grade}
return sum
}
类MyObject定义为:
public class MyObject
{
private String name;
private String description;
private double grade;
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public String getDescription()
{
return description;
}
public void setDescription(String description)
{
this.description = description;
}
public double getGrade()
{
return grade;
}
public void setGrade(double grade)
{
this.grade = grade;
}
}
用于计算该表达式的代码为:
public class Test
{
public static void main(String[] args) throws IOException
{
List<MyObject> objects = new ArrayList<>();
MyObject myObject = new MyObject();
myObject.setGrade(2.0);
objects.add(myObject);
myObject = new MyObject();
myObject.setGrade(1.0);
objects.add(myObject);
ClassPathResource resource = new ClassPathResource("/groovy-scripts/functions.groovy",Test.class);
File file = resource.getFile();
Binding binding = new Binding();
GroovyShell shell = new GroovyShell(binding);
Script script = shell.parse(file);
binding.setProperty("objects",objects);
String formula = "sum(objects)";
Object result = script.evaluate(formula);
System.out.println(result);
}
}
当我尝试运行代码时,不断收到以下异常:
Exception in thread "main" groovy.lang.MissingMethodException: No signature of method: Script1.sum() is applicable for argument types: (java.util.ArrayList) values: [[com.example.MyObject@3081f72c, com.example.MyObject@3148f668]]
Possible solutions: run(), run(), dump(), use([Ljava.lang.Object;), any(), use(java.lang.Class, groovy.lang.Closure)
at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecodeAdapter.java:71)
at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.callCurrent(PogoMetaClassSite.java:80)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:51)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:157)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:169)
at Script1.run(Script1.groovy:1)
at groovy.lang.GroovyShell.evaluate(GroovyShell.java:574)
at groovy.lang.GroovyShell.evaluate(GroovyShell.java:612)
at groovy.lang.GroovyShell.evaluate(GroovyShell.java:583)
at groovy.lang.Script.evaluate(Script.java:210)
at com.example.Test.main(Test.java:37)
请建议实现这一目标的正确方法
1条答案
按热度按时间vmjh9lq91#
我正在使用groovy实现
main
,但它离Java不远。选项1:使用闭包而不是函数
选项2:使用脚本继承
选项3:Groovy本身可能要短得多,您可能不需要过于复杂的解决方案