我就可得知用於捕獲lambda表達式,存在需要的對象分配(它是Object[]
或一些abc$Lambda$xyz
類型)。無論如何可以自定義這個過程嗎?比方說,我有這樣的代碼:普爾捕獲的lambda
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...
會做的分配(好吧,有機會的分配將通過逃逸分析被淘汰... ),但會使代碼相當不可讀。所以我要尋找一個更方面般的方式。
可能這樣的事情?
編輯:使池的功能更明顯,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;
}
}
,我會需要對所有可能的類型lambda表達式我要使用特定的簽名這樣的持有人。
也許我已經通過提供函數使示例複雜一點 - 但我想要捕捉一個事實,即在調用Supplier.get()
時可能會對捕獲的參數應用額外的計算。
並請忽略的事實是int值裝箱時可產生分配。
你的意思是像'supplier =() - > pool.getInteger();'? – bradimus
@bradimus對不起,我不明白這個問題。目的是得到一個合併對象,因爲它的業務邏輯返回5.池不能瞭解這個業務邏輯。 –
如果函數也是不捕獲的,這個持有者實現應該可以幫助您防止創建對象。我非常好奇你在哪裏必須優化這個部分,你能否提供一下它將被使用的地方? –