飛行士金融商品[リファクタリング車両コードの利用のアプリケーションエンジンデザインパターン]をベースのコンピューティングセンター

アビエイターだけでなく、オープンソースのJava式の評価である4つの事業、3つの操作、論理演算、およびその強力なインタフェースがサポートするカスタム拡張機能をサポートしています。そこで、金融商品プラットフォームの復興チーム最適化された金融商品は、当社のビジネスニーズを拡大するためには、このGoogleの計算エンジンを選択し、我々は我々のビジネスシナリオをサポートするために、カスタム関数の範囲をカスタマイズします。

#### 1、シンプルなAPI呼び出しのサンプル
の最初のステップ:私たちは、Mavenのプロジェクトを頼りに導入する必要があります

<!-- 表达式解析引擎 -->
<dependency>
   <groupId>com.googlecode.aviator</groupId>
   <artifactId>aviator</artifactId>
   <version>3.0.0</version>
</dependency>

ステップ2:静的メソッド呼び出しAviatorEvaluator.execute、戻り型オブジェクトタイプは、次の例

import com.googlecode.aviator.AviatorEvaluator;
public class SimpleExample {
    public static void main(String[] args) {
        Long result = (Long) AviatorEvaluator.execute("1+2+3");
        System.out.println(result);
    }
}

####図2は、どのように機能をカスタマイズする
最初のステップを:私たちはAbstractVariadicFunctionを継承することができ、それに応じてインターフェイスを実装します。ここでは、カスタム関数より多くのデジタルサムを持っています。

import com.googlecode.aviator.runtime.function.AbstractVariadicFunction;
import com.googlecode.aviator.runtime.function.FunctionUtils;
import com.googlecode.aviator.runtime.type.AviatorDecimal;
import com.googlecode.aviator.runtime.type.AviatorObject;

import java.math.BigDecimal;
import java.util.Map;

/**
 * @description: 多个数字求和计算(其中任何一个数字为空则作为0处理)
 * @Date : 2018/9/7 下午5:40
 * @Author : 石冬冬-Seig Heil
 */
public class SumFunction extends AbstractVariadicFunction {
    @Override
    public AviatorObject variadicCall(Map<String, Object> env, AviatorObject... args) {
        BigDecimal sum = new BigDecimal(0);
        for(AviatorObject each : args){
            if(each.getValue(env) == null){
                continue;
            }
            Number value = FunctionUtils.getNumberValue(each, env);
            sum = sum.add(new BigDecimal(value.toString()));
        }
        return new AviatorDecimal(new BigDecimal(sum.toString()));
    }

    @Override
    public String getName() {
        return "sum";
    }
}

ステップ2:登録と呼び出しの機能

AviatorEvaluator.addFunction(new SumFunction());
System.out.println(AviatorEvaluator.execute("sum(1,2)"));

####図3に示すように、様々な表現型
#### 3.1、三元式、論理演算

Map<String,Object> evn = new HashMap<String,Object>(){{
  put("a",3);
  put("b",2);
  put("c",5);
  put("d",-2);
}};
String expression = " (a > b) && (c > 0 || d > 0) ? a : b";
System.out.println(AviatorEvaluator.execute(expression,evn));

#### 3.2、さまざまな組み込み関数と数学の文字列

AviatorEvaluator.execute("string.length('hello')");    // 求字符串长度
AviatorEvaluator.execute("string.contains('hello','h')");  //判断字符串是否包含字符串
AviatorEvaluator.execute("string.startsWith('hello','h')");  //是否以子串开头
AviatorEvaluator.execute("string.endsWith('hello','llo')");  是否以子串结尾

AviatorEvaluator.execute("math.pow(-3,2)");   // 求n次方
AviatorEvaluator.execute("math.sqrt(14.0)");   //开平方根
AviatorEvaluator.execute("math.sin(20)");    //正弦函数

#### 4、サポートされるデータ型
•番号タイプ:Javaのロングとダブル、手段に対応する数値型、サポート二つのタイプは、任意の整数はロングに変換されること、および任意の浮動小数点数が変換されますダブルとして、入ってくるユーザーの値を含めても、真の変換です。それは、科学的表記法、小数のみサポートをサポートしていません。-1,100,2.3のように。
•文字列タイプ:着信または文字列は、Stringに変換される場合は、そのような「HelloWorldの」などの文字列型、テキスト文字列を囲む単一引用符または二重引用符は、可変です。
•Bool型:trueとfalseの値について、真と偽の定数、およびJavaとBoolean.FalseにBoolean.TRUE対応。
•パターンの種類:同様のルビーのような/ \ D + /、java.util.Patternの内部実装//引用符で囲まれた文字列へのPerlの正規表現。
•変数タイプ:例えば、「」、「B」のようにしてJava変数の命名規則ユーザーによって渡された変数の同じ値を、など
•nilのタイプ:定数ヌルでJavaに似たゼロ、ゼロではなく、特別であるだけでなく、nilに参加== ,! =比較も参加することができ>、> =、<、<=比較、任意のタイプの飛行士nが所定のゼロゼロ自体を除く、ゼロよりも大きいですnilはtrueを返します。ユーザー渡された変数の値がnullの場合、それはまた、ゼロとして扱われ、nilの印刷はnullです。
5 ####、サポートオペレータ
#####算術演算子
+を含む飛行士支援共通の算術演算子、 - * /%5つのバイナリ演算子、単項演算子、および「 - 」。前記- * /%の一塩基性と「 - 」数のみのタイプに適用することができます。「+」だけでなく、種類の番号が、それはまた、文字列、および文字列連結または他のオブジェクトを追加するために使用することができます。アビエイター、任意のString型と結果が文字列です。
#####論理演算子
Avaitor論理演算子のサポートは、「!」一価否定演算子を含み、ロジックと「&&」論理や「||。」唯一のブール論理演算子の数。関係演算子
アビエイターは「関係演算子は、「<」、「<=」「>」「> =」が含ま支持され、
「そして」!=」。&&と||のルールが短絡されている。
オペレータとの関係の関係は、パターンの中で、文字列の間で、ブールの間、変数はnilの間と同様に、他のタイプのを数作用することができます異なる種類の比較はゼロ以外、相互に比較することはできません。
アビエーターがnil nilを除く任意のより大きなオブジェクトが必要です。
#####ビット単位
アビエイターを含む、すべてのJavaビット演算子をサポートしています「&」「|」 " ^「」〜「」>>「」<< 『』 >>> 『
#####マッチ演算子
マッチ演算子』 =〜「と文字列のパターンマッチングが使用され、左のオペランドの文字列する必要があります、右オペランドは。。変数$ NUMに保存された後に成功したマッチ、パターンパケット、num個のパケットインデックスパターンでなければならない
三項演算子#####
アビエイターはelse文が提供されていない場合は、しかし三項演算子を提供します「:?」、ブール値の結果は、ブール式であり、EXP1とEXP2アビエイターは、任意の有効な式にすることができ、EXP1と一貫性のある結果EXP2戻り値の型を必要としないでなければなりませんブールEXP1 :? EXP2の形態です。
6は####、需要のニーズを拡大するためには、関連する文字を拡大しました
NVL:空の場合、デフォルト値を設定します

/**
 * @description: 为空时,设置一个默认值
 * @Date : 2018/9/7 下午5:40
 * @Author : 石冬冬-Seig Heil
 */
public class Nvl extends AbstractVariadicFunction {
    @Override
    public AviatorObject variadicCall(Map<String, Object> env, AviatorObject... args) {
        Number originValue = FunctionUtils.getNumberValue(args[0], env);
        Number defaultValue = FunctionUtils.getNumberValue(args[1], env);
        return new AviatorDecimal(new BigDecimal(Optional.ofNullable(originValue).orElse(defaultValue).toString()));
    }

    @Override
    public String getName() {
        return "nvl";
    }
}

合計:デジタル和の複数

/**
 * @description: 多个数字求和计算(其中任何一个数字为空则作为0处理)
 * @Date : 2018/9/7 下午5:40
 * @Author : 石冬冬-Seig Heil
 */
public class Sum extends AbstractVariadicFunction {
    @Override
    public AviatorObject variadicCall(Map<String, Object> env, AviatorObject... args) {
        BigDecimal sum = new BigDecimal(0);
        for(AviatorObject each : args){
            if(each.getValue(env) == null){
                continue;
            }
            Number value = FunctionUtils.getNumberValue(each, env);
            sum = sum.add(new BigDecimal(value.toString()));
        }
        return new AviatorDecimal(new BigDecimal(sum.toString()));
    }

    @Override
    public String getName() {
        return "sum";
    }
}

分:最低デジタルの複数

/**
 * @description: 多个数字求最小值(其中任何一个数字为空则作为0处理)
 * @Date : 2018/9/7 下午5:40
 * @Author : 石冬冬-Seig Heil
 */
public class Min extends AbstractVariadicFunction {
    @Override
    public AviatorObject variadicCall(Map<String, Object> env, AviatorObject... args) {
        List<BigDecimal> list = new ArrayList<>();
        for(AviatorObject each : args){
            if(each.getValue(env) == null){
                continue;
            }
            Number value = FunctionUtils.getNumberValue(each, env);
            list.add(new BigDecimal(value.toString()));
        }
        list.sort(Comparator.comparing(BigDecimal::doubleValue));
        return new AviatorDecimal(new BigDecimal(list.get(0).toString()));
    }

    @Override
    public String getName() {
        return "min";
    }
}

最大:デジタルの複数の最大値は、シーク

/**
 * @description: 多个数字求最大值(其中任何一个数字为空则作为0处理)
 * @Date : 2018/9/7 下午5:40
 * @Author : 石冬冬-Seig Heil
 */
public class Max extends AbstractVariadicFunction {
    @Override
    public AviatorObject variadicCall(Map<String, Object> env, AviatorObject... args) {
        List<BigDecimal> list = new ArrayList<>();
        for(AviatorObject each : args){
            if(each.getValue(env) == null){
                continue;
            }
            Number value = FunctionUtils.getNumberValue(each, env);
            list.add(new BigDecimal(value.toString()));
        }
        list.sort(Comparator.comparing(BigDecimal::doubleValue).reversed());
        return new AviatorDecimal(new BigDecimal(list.get(0).toString()));
    }

    @Override
    public String getName() {
        return "max";
    }
}

ラウンド:丸め

/**
 * @description: 四舍五入
 * @Date : 2018/9/7 下午5:40
 * @Author : 石冬冬-Seig Heil
 */
public class Round extends AbstractVariadicFunction {
    @Override
    public AviatorObject variadicCall(Map<String, Object> env, AviatorObject... args) {
        Number value = FunctionUtils.getNumberValue(args[0], env);
        return new AviatorDecimal(Math.round(value.doubleValue()));
    }

    @Override
    public String getName() {
        return "round";
    }
}

ceil:向上取整

/**
 * @description: 向上取整
 * @Date : 2018/9/7 下午5:40
 * @Author : 石冬冬-Seig Heil
 */
public class Ceil extends AbstractVariadicFunction {
    @Override
    public AviatorObject variadicCall(Map<String, Object> env, AviatorObject... args) {
        Number value = FunctionUtils.getNumberValue(args[0], env);
        return new AviatorDecimal(Math.ceil(value.doubleValue()));
    }

    @Override
    public String getName() {
        return "ceil";
    }
}

床:切り捨て

/**
 * @description: 向下取整
 * @Date : 2018/9/7 下午5:40
 * @Author : 石冬冬-Seig Heil
 */
public class Floor extends AbstractVariadicFunction {
    @Override
    public AviatorObject variadicCall(Map<String, Object> env, AviatorObject... args) {
        Number value = FunctionUtils.getNumberValue(args[0], env);
        return new AviatorDecimal(Math.floor(value.doubleValue()));
    }

    @Override
    public String getName() {
        return "floor";
    }
}

以下は私の数の二次元コードの画像を公開、歓迎の注目です。
秋の霜

公開された46元の記事 ウォン称賛27 ビュー160 000 +

おすすめ

転載: blog.csdn.net/shichen2010/article/details/82630334