访问外部变量的函数

时间:2013-01-07 13:02:31

标签: java callback guava final

我有一个迭代重型数据集的函数,接收回调(Google的Guava函数)并在数据集的每个项目上运行回调:

void processData(..., Function<Item, Void> callback) {
  ...
  for (Item item : data) {
    callback.apply(item);
  }
} 

使用此功能,我想传递一个回调,将所有项目添加到列表或地图中:

List<Item> itemList;
processData(..., new Function<Item, Void)() {
  @Override public void apply(Item item) {
    itemList.add(item);
  }
});

然而,似乎我不能这样做,因为itemList不是最终的,并且根据定义不能是最终的。

这种情况有解决方案吗?或许这整个模式都错了?

3 个答案:

答案 0 :(得分:3)

您似乎对final关键字的理解不正确。这句话:

final List<Item> itemList = new ArrayList<Item> ();

仅表示无法重新分配itemList变量。它不会阻止您修改它指向的对象和此调用:

itemList.add(someItem);

在最终列表中完全有效。不允许写的是:

itemList = someOtherItemList; //forbidden, itemList is final

答案 1 :(得分:0)

如果您在声明期间创建实例,则可以使用final:

final List<Item> itemList = new ArrayLis<Item>();
processData(..., new Function<Item, Void)() {
  @Override public void apply(Item item) {
    itemList.add(item);
  }
});

final意味着您无法重新分配变量,但可以在其上调用方法!

答案 2 :(得分:0)

由于您需要的是List,输入也是List,我认为 Lists.transform 是您的选择:

List<Item> itemList = Lists.transform(fromList, new Function<Item, Item>(){
    @Override public Item apply(Item input) {
        ...
        return transformedItem;
    }});