# 實例講解

## 定義函數

``````

/**
* 接受兩個int類型的參數，然後返回計算的sum值
*/
public static class SumFunction extends ScalarFunction{
public Integer eval(Integer a, Integer b){
return a + b;
}
}

/**
* 接收非空的int或者boolean類型
*/
public static class StringifyFunction extends ScalarFunction{
public String eval(int i){
return String.valueOf(i);
}

public String eval(boolean b){
return String.valueOf(b);
}
}

/**
*/
@FunctionHint(input = [@DataTypeHint("INT")])
@FunctionHint(input = [@DataTypeHint("BOOLEAN")])
public static  class StringifyFunction extends ScalarFunction {
public String eval(Object o) {
return o.toString();
}
}

/**
* 接收任何類型的值，然後把它們轉成string
*/
public static class StringifyFunction1 extends ScalarFunction{
public String eval(@DataTypeHint(inputGroup = InputGroup.ANY) Object o){
return o.toString();
}
}

``````

## 通過程序註冊函數

``````	//通過程序的方式來註冊函數
SumFunction sumFunction = new SumFunction();
tableEnv.registerFunction("mysum", sumFunction);
Table table1 = tableEnv.sqlQuery("select mysum(1,2)");
tableEnv.toAppendStream(table1, Row.class).print();

``````

## 通過sql註冊函數

``````
//通過sql的方式來註冊函數
String className = SumFunction.class.getName();
String sql = "create temporary function default_catalog.default_database.mysum1" +
" as '" + className + "'";
tableEnv.sqlUpdate(sql);
Table table2 = tableEnv.sqlQuery("select mysum1(3,4)");
tableEnv.toAppendStream(table2, Row.class).print();

``````

``````
//列出來所有的函數，看是否包含我們定義的函數
String[] functions = tableEnv.listFunctions();
Stream.of(functions).filter(f->f.startsWith("mysum")).forEach(System.out::println);

``````