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);`

控制台不显示“测试....”

如何避免偷懒
我也试试

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

但不影响

4

3 回答 3

19

Functions 一般不应该有副作用;那是你真正的问题。

也就是说,如果您坚持立即应用转换,请复制: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

为了补充路易斯的回答,您使用Lists.transform()的好像它修改了原始list的一样,例如Collections.sort(). 它没有。

您必须使用的返回值Lists.transform()来查看发生的情况,请记住,这是一个每次调用时都会评估的视图。因此,如果您需要多次使用结果,如 Louis 所说,请在新的List( ArrayList,ImmutableList等) 中复制一份。

于 2012-11-19T08:47:14.713 回答