描述:
调用包中类的静态函数。
语法:
invoke(p.c.f,ai,…)
备注:
调用包p中类c的静态函数f,p可省略。不允许重载方法(同名不同参)。
调用自定义函数时,需要将.class格式的自定义函数类文件放置到 [集算器安装根目录]/esProc/classes/{p}路径下;如果在web端使用,相应的,应该放置在WEB-INF/classes/{p}路径下。
参数:
p |
包路径。 |
c |
类名。 |
f |
静态方法名。 |
ai |
参数。 |
invoke传递参数时参数类型与JAVA类中参数类型对应如下:
bool |
java.lang.Boolean |
int |
java.lang.Integer |
long |
java.lang.Long |
float |
java.lang.Double |
decimal |
java.math.BigDecimal |
date |
java.sql.Date |
time |
java.sql.Time |
datetime |
java.sql.Timerstamp |
string |
java.lang.String |
blob |
byte [] |
序列 |
Object[] |
选项:
@x |
参数或者返回值为序列时将被转换,可递归执行。 |
示例:
(一)JAVA类api.Calc01内容如下:
package api;
public class Calc01 {
public static Double distance1(Number loc) {
double len = Math.abs(loc.doubleValue());
len = Math.round(len*1000)/1000d;
return Double.valueOf(len);
}
}
将Calc01.class放至[集算器安装根目录]/esProc/classes/api路径下,然后在网格中调用函数distance1:
|
A |
|
1 |
-12.34567 |
|
2 |
=invoke(api.Calc01.distance1,A1) |
|
3 |
=invoke(api.Calc01.distance1, -512) |
|
静态方法distance1计算给定的一个坐标,计算与原点之间的距离,计算结果保留3位小数。
在集算器中能够调用的方法,除了必须是静态static外,还必须公开public。
(二)创建实现ILineInput接口的自定义类LineReaders,以便用户使用文件游标读取各种类型的数据文件。可将文件路径作为参数传递给自定义类,通过流读取文件内容,实现单行读取记录、跳过单行和关闭游标的方法。
(1)示例代码如下:
package api;
import java.io.BufferedReader;
import java.io.EOFException;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import com.scudata.dm.ILineInput;
import com.scudata.dm.UserUtils;
import com.scudata.dm.cursor.ICursor;
public class LineReaders implements ILineInput {
private String pathName;
private boolean hasTitle;
private BufferedReader bfr;
final String COL_SEP = "\t";
final String encoding = "UTF-8";
String lineTxt = null;
final DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
String[] rowData;
Object[] datas = new Object[3];
public LineReaders(String pathName,boolean hasTitle) {
this.pathName = pathName;
this.hasTitle=hasTitle;
}
public static LineReaders newInstance(String pathName,boolean hasTitle) {
return new LineReaders(pathName,hasTitle);
}
private BufferedReader getBufferedReader() throws IOException {
if (bfr == null) {
File file = new File(pathName);
if (file.isFile() && file.exists()) { // 判断文件是否存在
InputStreamReader read = new InputStreamReader(new FileInputStream(file), encoding);// 考虑到编码格式
bfr = new BufferedReader(read);
}
}
return bfr;
}
//读取单行
public Object[] readLine() throws IOException {
BufferedReader bfr = getBufferedReader();
try {
if (!hasTitle) {
datas[0] = "ID";
datas[1] = " BirthDate";
datas[2] = " Name";
}
while ((lineTxt = bfr.readLine()) != null) {
rowData = lineTxt.split(COL_SEP);
if (rowData != null && rowData.length == 3) {
if (hasTitle) {
datas[0] = rowData[0];
datas[1] = rowData[1];
datas[2] = rowData[2];
hasTitle = false;
return datas;
}
datas[0] = Integer.parseInt(rowData[0]);
datas[1] = df.parse(rowData[1]);
datas[2] = rowData[2];
return datas;
}
}
return null;
} catch (EOFException e) {
return null;
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return datas;
}
//将ILineInput实例转换为游标
public static ICursor UserUtilsReader(String pathName,boolean hasTitle){
return UserUtils.newCursor(newInstance(pathName,hasTitle), "t");
}
//跳过单行
public boolean skipLine() throws IOException{
BufferedReader bfr = getBufferedReader();
try {
String s = bfr.readLine();
if(s!=null){
return true;
}
} catch (EOFException e) {
return false;
}
return false;
}
//关闭游标
public void close() throws IOException {
if (bfr != null) {
bfr.close();
bfr = null;
}
}
}
(2)将此类文件LineReaders.class放至【集算器安装根目录】/esProc/classes下的api文件夹中
(3)游标读取的文件(格式为UTF-8)内容如下:
(4)在集算器网格文件中通过invoke()函数调用自定义函数:
|
A |
|
1 |
=invoke(api.LineReaders.UserUtilsReader,"D://abc.txt",true) |
调用自定义函数。 |
2 |
=A1.skip(3) |
3 |
3 |
=A1.fetch() |
|
(三)使用序列类型得参数
package api;
public class Calc01 {
public static int sum(Object []vals) {
int result = 0;
for(Object val : vals){
result += ((Number)val).intValue();
}
return result;
}
public static Integer[] sum2(Object []vals){
Integer []result = new Integer[vals.length];
for(int i = 0;i < vals.length; ++i){
result[i] = sum((Object[])vals[i]);
}
return result;
}
}
|
A |
|
1 |
[1,2,3,4] |
|
2 |
=invoke@x(api.Calc01.sum,A1) |
使用选项@x转换序列参数,静态方法sum对序列A1中的成员累加:
|
3 |
=invoke@x(api.Calc01.sum, to(100)) |
计算从1累加到100:
|
4 |
=invoke@x(api.Calc01.sum2,A1.(to(~))) |
使用选项@x转换参数,此时参数为序列的序列:
|