7

Lambdaj (および他の同様のライブラリ) は、having述語を次のように定義できる関数を提供します ( lambdaj 機能ページから直接の例)。

List<Person> oldFriends = 
    filter(having(on(Person.class).getAge(), greaterThan(30)), meAndMyFriends);

SQL の where 句に似た単純な文字列構文を使用して Java 述語オブジェクトを定義できるようにしたい"age > 30"ので、上記のフィルターは次のようになります。

List<Person> oldFriends = 
    filter(having(Person.class, "age > 30"), meAndMyFriends);

そのようなライブラリは存在しますか、または自分で構築するために使用できるクエリ解析部分の構築ブロックを誰かが推奨できますか? 実際には、それが作成する述語 (hamcrest、guava など) の種類は気にしません。

頭のてっぺんから、サポートするのに素晴らしいことをたくさん思いつくことができます: 等式と不等式、カスタム型とプリミティブ型、および/または/ではなく、括弧LIKE(文字列の場合)、in(...)、列挙型の解釈名前、プロパティのプロパティ。

より複雑な述語の例を次に示します。

"salesCount > 10 and (country='UK' or city='New York')
and attitude not in (MENACING, RUDE)
and product.name <> 'Widget' "

(この例では、述語が適用されるクラス (SalesPersonクラスなど) に getSalesCount()、getCountry()、getCity() メソッド、および getAttitude() (enum を返す) があることを前提としています。また、プロパティがあります。メソッド getName を持つ型を返す getProduct )。

動機: 複数の言語 API (現在は Java と C#) を備えたクライアント サーバー システムがあります。サーバー プロセス (Java で記述されている) だけが正確な内容を知っている一連のオブジェクトをフィルター処理する述語をユーザーが指定する、言語に依存しない方法を探しています。

4

2 に答える 2

2

MVELを見てみましょう。次のような式をサポートしています。

(user.name == 'John Doe') && ((x * 2) - 1) > 20

クライアントからいくつかの基本的なビジネス ルールを表現するために、プロジェクトで 1 回使用しました。

于 2012-11-06T08:51:28.647 に答える
0

そのようなライブラリがすでに存在するかどうかはわかりませんが、groovyを使用して、そのような式をその場でコンパイル/評価できます。

于 2012-11-05T18:23:29.087 に答える