私の UI の要素の 1 つは、いくつかの数式を使用して、カテゴリ別に集計されたアイテムのリストを示すテーブルです (以下のターゲット出力を参照)。
ユーザーがセルをスプレッドシートのような数式にバインドできるようにするための最良のアプローチは何でしょうか?
- パフォーマンス: 実際のデータは頻繁に変更され、テーブルが大きくなり、数式が複雑になる可能性があるため、パフォーマンスと CPU 使用率が懸念されます。
- 構成の容易さ (構成は開発者によって行われるため、プログラミングが必要になる場合があります)
- 構成の保守性
これまでに想定したアプローチは次のとおりです。
- Java Scripting API を使用しますが、パフォーマンスを向上させるために JVM ベースのアプローチに固執したいと思います
- 実行時に実装を作成し
interface Formula { double calculate(); }
、生成、コンパイル、およびロードします。これにより、JIT は生成されたメソッドをコンパイルできます。 - 2 と同じですが、clojure などの別の JVM ベースの言語を使用します。これにより、オンザフライでのコンパイルが容易になり、適切な機能的アプローチが可能になります (たとえば、以下の平均と合計の計算には map/reduce が役立ちます) - よくわかりませんただし、パフォーマンスへの影響については。
どちらのアプローチがより理にかなっていますか? 他に検討すべきソリューションやライブラリはありますか?
例
目標をより明確にするために、ここに不自然な例を示します。表の項目が次のとおりであると仮定します。
public class Item() {
public String category;
public String name;
public int quantity;
public double price;
}
目標出力
Category Name Quantity Price (avg) Value (sum)
All 82 1,090
Bikes 45 650
Bike 1 10 40 400
Bike 2 5 50 250
Cars 120 440
Car 1 3 100 300
Car 2 1 140 140
列の構成
列は次のように定義できます。
Column # Formula
1 item.name;
2 item.quantity;
3 item.price;
4 Math.abs(column_2 * column_3); //calls a JDK method
集計構成
また、集計カテゴリと集計式は次のように定義できます。
AGGREGATION #1: Category cat = item.category();
Column # Formula
1 cat;
2 "";
3 thisColumn.filter(cat).items().average(); //utility method
//this one is more complex
4 { double sum = 0;
for (double value : thisColumn.filter(cat).items())
sum += value;
return sum;
}