我有list
hashmap<string, real>
。我想访问列表中的每个元素,在其上应用predicate
,如果谓词返回true,则将元素添加到另一个列表。
例如假设我有一个像这样的散列图列表 - {(a, 15), (b, 17), (c, 12)}, {(a, 12), (b, 13), (d, 90)}
。我的谓词就像a > 7 & b < 15
。现在我将这个谓词应用于列表的每个元素,并发现第二个元素满足谓词。
应用谓词应该很简单,因为我所要做的就是访问元素并将其值与谓词提供的值进行比较。
我遇到的部分是如何在predicate
文件中保存这样的configuration
,以便可以轻松地将其转换为类,并且可以添加新的谓词而无需摆弄核心代码
答案 0 :(得分:1)
一种方法是使用nashorn
javascript引擎。为每个谓词编写一个java脚本验证函数,并将其存储在java脚本文件中。
function pred1(a,b)
{
if(a>7 && b<15) return true;
else return false;
}
创建并加载谓词文件。您需要在配置文件中提及所有谓词文件路径,并从配置文件中查找它们的路径。
Properties property = new Properties();
property.load(configuration file path goes here);
示例configuration
文件属性:
predicatefileList:test1.js,...
获取财产,
String[] filePaths = ((String)property.get("predicatefileList")).split(",");
初始化并使用脚本引擎。
ScriptEngineManager factory = new ScriptEngineManager();
ScriptEngine engine = factory.getEngineByName("nashorn");
// use filePaths here instead of the file name.
ScriptObjectMirror s = (ScriptObjectMirror)engine.eval("load(\"test1.js" + "\");");
对于map
中的每个list
,请将predicate function
传递给arguments
函数来调用predicate
:
list.forEach(map->{
System.out.println(s.call(map.get("a"), m.get("b")));
});