0

重いデータセットを反復処理し、コールバック (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 は最終的なものではなく、定義上最終的なものにすることはできないため、それはできないようです。

この場合の解決策はありますか?それとも、このパターン全体が間違っているのでしょうか?

4

3 に答える 3

3

最終キーワードの理解が間違っているようです。この文:

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

itemList変数を再割り当てできないことのみを意味します。それが指すオブジェクトとこの呼び出しを変更することを妨げません。

itemList.add(someItem);

最終的なリストで完全に有効です。許可されていないのは、次のように書くことです。

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

必要なのはaListであり、入力もであるため、 Lists.transformがあなたの場合の選択Listだと思います。

List<Item> itemList = Lists.transform(fromList, new Function<Item, Item>(){
    @Override public Item apply(Item input) {
        ...
        return transformedItem;
    }});
于 2013-01-08T09:46:34.017 に答える
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 に答える