我认为为了捕获 lambda,需要分配一个对象(无论是它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);
并且我可以为不同的参数类型提供专门的版本(因为 usingObject...
会进行分配(好吧,分配可能会被转义分析消除......)但这会使代码变得非常不可读。因此我正在寻找一种更像方面的方式。
这样的事情可能吗?
编辑:为了使池的功能更加明显,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 被装箱的事实,它可以产生分配。