我有一个迭代重型数据集的函数,接收回调(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不是最终的,并且根据定义不能是最终的。
这种情况有解决方案吗?或许这整个模式都错了?
答案 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;
}});