如何在java中的配置文件中存储谓词

时间:2014-11-11 23:33:51

标签: java

我有list hashmap<string, real>。我想访问列表中的每个元素,在其上应用predicate,如果谓词返回true,则将元素添加到另一个列表。

例如假设我有一个像这样的散列图列表 - {(a, 15), (b, 17), (c, 12)}, {(a, 12), (b, 13), (d, 90)}。我的谓词就像a > 7 & b < 15。现在我将这个谓词应用于列表的每个元素,并发现第二个元素满足谓词。 应用谓词应该很简单,因为我所要做的就是访问元素并将其值与谓词提供的值进行比较。

我遇到的部分是如何在predicate文件中保存这样的configuration,以便可以轻松地将其转换为类,并且可以添加新的谓词而无需摆弄核心代码

1 个答案:

答案 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")));
});