11
Map<String,Object> map = Maps.newHashMap();
map.put("test","123");
map.put("fuyou001","456");
map.put("id",145);
List<Map<String,Object>> list = Lists.newArrayList();
list.add(map);
Lists.transform(list, new Function<Map<String, Object>, Object>() {
  @Override
  public Object apply(@Nullable Map<String, Object> input) {
    System.out.println("test:" + input);
    return input;
  }
});
System.out.println(list);`

コンソールに「test....」が表示されない

遅延適用を回避する方法
私も試します

List<Map<String,Object>> newList = new ArrayList<Map<String, Object>>(list.size());
Collections.copy(newList,list);

しかし、効果はありません

4

3 に答える 3

19

Function一般に、副作用はありません。それがあなたの本当の問題です。

とはいえ、変換をすぐに適用したい場合は、次のようにコピーしてくださいLists.newArrayList(Lists.transform(list, function))

于 2012-11-17T11:10:01.093 に答える
4

ImmutableListを使用すると、値が熱心に計算されるため、後で追加のコピーを作成する必要はありません。これはおそらくよりエレガントな解決策です:

list = ImmutableList.copyOf(Lists.transform(list, 
  new Function<Map<String, Object>, Object>() {
  @Override
  public Object apply(@Nullable Map<String, Object> input) {
    System.out.println("test:" + input);
    return input;
  }
}));
System.out.println(list);`
于 2012-11-23T05:18:30.237 に答える
3

Louisの答えを補足するためにLists.transform()、元のを変更したかのように使用していlistますCollections.sort()。そうではありません。

Lists.transform()何かが発生するのを確認するには、の戻り値を使用する必要があります。これは、呼び出すたびに評価されるビューであることに注意してください。したがって、Louisが言ったように、結果を数回使用する必要がある場合は、新しいListArrayList、、ImmutableListなど)でコピーを実行します。

于 2012-11-19T08:47:14.713 に答える