0

我有一个迭代大量数据集的函数,接收回调(谷歌的番石榴函数)并在数据集的每个项目上运行回调:

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 不是最终的,并且根据定义不能是最终的。

这种情况有解决方案吗?或者也许这整个模式是错误的?

4

3 回答 3

3

您似乎对 final 关键字的理解不正确。这个说法:

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

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

itemList.add(someItem);

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

itemList = someOtherItemList; //forbidden, itemList is final
于 2013-01-07T13:06:09.443 回答
0

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

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

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

于 2013-01-07T13:03:50.653 回答
0

由于您需要的是 aList并且输入也是 a List,因此我认为Lists.transform是您的选择:

List<Item> itemList = Lists.transform(fromList, new Function<Item, Item>(){
    @Override public Item apply(Item input) {
        ...
        return transformedItem;
    }});
于 2013-01-08T09:46:34.017 回答