invoke()

阅读(2626) 标签: 调用, 静态函数,

描述:

调用包中类的静态函数。

语法:

invoke(p.c.f,ai,…)

备注:

调用包p中类c的静态函数fp可省略。不允许重载方法(同名不同参)。

调用自定义函数时,需要将.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

参数或者返回值为序列时将被转换,可递归执行。

示例:

(一)JAVAapi.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中的成员累加:

IMG_256

3

=invoke@x(api.Calc01.sum, to(100))

计算从1累加到100

IMG_256

4

=invoke@x(api.Calc01.sum2,A1.(to(~)))

使用选项@x转换参数,此时参数为序列的序列:

IMG_256