我有一个函数,可以迭代大量数据集,接收回调(Google 的 Guava 函数)并对数据集的每个项目运行回调:
void processData(..., Function<Item, Void> callback) {
...
for (Item item : data) {
callback.apply(item);
}
}
使用此函数,我想传递一个回调,将所有项目添加到列表或 map 中:
List<Item> itemList;
processData(..., new Function<Item, Void)() {
@Override public void apply(Item item) {
itemList.add(item);
}
});
但是,看来我不能这样做,因为 itemList 不是最终的,而且根据定义也不能是最终的。
这种情况有解决办法吗?或者也许整个模式都是错误的?
最佳答案
您似乎对final关键字的理解不正确。本声明:
final List<Item> itemList = new ArrayList<Item> ();
only 表示 itemList
变量无法重新分配。它不会阻止您修改它指向的对象和此调用:
itemList.add(someItem);
在最终列表中完全有效。不允许的写法是:
itemList = someOtherItemList; //forbidden, itemList is final
关于java - 函数访问外部变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14196543/