自定义函数实现set功能

总所周知,在润乾的内置的函数的功能相当之大,但是再多的函数也无法完全满足五花八门的业务需求,用户往往需要自定义函数。

例如在润乾的内置函数中有list()获得一个枚举的数据集合的函数,map()显示值对照表函数,从对照表中找出当前单元格对应值的显示值的函数,这些函数的功能也和java中的list、map对象的功能基本相似,也是为了用户能更快的了解和使用润乾的函数。

可是大家都知道java中的对象和list、map一起的还有一个set(可以去除重复字段),在实际需求中,往往会对重复数据进行过滤,而润乾的内置函数中则没有set函数,则需要通过自定义函数来实现。

具体需求描述:

两个数据集中分别为name和value字段,数据结构完全一样。只是数据不同,name值可能会有重复。最后样式要将所有出现过的name值列表出来,并且输出相对应的value值。

实现方式:

首先数据大概如下:

编写自定义函数集成Function类,实现calculate()方法:

public Object calculate(Context ctx, boolean isInput) {
Expression param1 = (Expression) this.paramList.get(0);//取得传入的表达式

Object result = Variant2.getValue(param1.calculate(ctx, isInput),
false, isInput);//对表达式进行解析,求出具体值

//通过set对象对这组数据进行重复过滤

ArrayList list = (ArrayList) result;
Set set = new HashSet();

for (int i = 0; i < list.size(); i++) {
set.add(list.get(i));
}

//这里直接返回set已经可以实现,不过后续由于需要对数据进行扩展,所以返回一个list集合。
List list1 = new LinkedList();
Iterator it = set.iterator();
while (it.hasNext()) {
list1.add(it.next());
}

return list1;
}

接下来进行自定义函数的注册,这里不细说了,可参照应用开发教程的自定义了函数中相关介绍。

然后在设计器中就可以使用该函数进行数据过滤。将ds1和ds2的通过list放到一个集合中传给set函数,然后在对过滤后的数据使用润乾的sort函数进行排序,最后使用ds.select1根据条件取得相对应的value值进行求和计数等计算功能。

这样就通过自定义函数实现了该功能,展现效果如下: