ラムダを捕獲するには、オブジェクトが割り当てられている必要があります(Object[]
またはabc$Lambda$xyz
タイプ)。このプロセスを任意にカスタマイズすることは可能ですか?のは、私はこのコードを持っているとしましょう:プール捕獲ラムダ
private void test() {
int x = 5;
Supplier<Integer> supplier =() -> x;
foo(supplier); // potentially passes the supplier to another thread etc.
}
を、私はちょうどプールからそれを取得し、値を記入x
をキャプチャするオブジェクトを割り当てたいが、代わりにしないでください。私はまた、ある時点でオブジェクトをプールに戻すことができることも知っています。
私は
Supplier<Integer> supplier = pool.get(x, v -> v);
を書くことができそしてObject...
を使用して割り当てを行うだろうと私は((異なる引数の型に特化したバージョンを持っている可能性がOK、割り当てはエスケープ解析によって排除されるという可能性があります... )しかし、それはかなり読めないコードをレンダリングするでしょう。したがって、私はより多くの側面のような方法を探しています。
はそのようなことは可能ですか?
EDIT:プールの機能をより明確にする、get
は
class IntHolderSupplier implements Supplier<Integer> {
int value;
IntFunction<Integer> func;
@Override public Integer get() {
return func.apply(value);
}
}
class Pool {
Supplier<Integer> get(int arg, IntFunction<Integer> func) {
IntHolderSupplier holder = ...;
holder.value = arg;
holder.func = func;
return holder;
}
}
として実装することができ、私が使用するすべての可能なタイプのラムダのために特定の署名と、このようなホルダーが必要になります。
私は関数を提供することで少し複雑になっているかもしれませんが、Supplier.get()
の呼び出し時にキャプチャされた引数に追加の計算が適用される可能性があります。
そして、intがボックス化されて割り当てを生成できるという事実は無視してください。
あなたは 'supplier =() - > pool.getInteger();'のようなものを意味しますか? – bradimus
@bradimus申し訳ありませんが、私はその質問を理解していません。その意図は、ビジネスロジックが5を返すプールされたオブジェクトを取得することです。プールはこのビジネスロジックを知ることができません。 –
このホルダーの実装は、Functionもキャプチャしていない場合にオブジェクトの作成を防ぐのに役立ちます。私はあなたがこの部分を最適化しなければならないところに非常に興味があります、あなたはそれが使用されることになる文脈を教えてください? –