如何避免在番石榴中使用lalsily Lists.transform?
Map map = Maps.newHashMap(); map.put("test","123"); map.put("fuyou001","456"); map.put("id",145); List<Map> list = Lists.newArrayList(); list.add(map); Lists.transform(list, new Function<Map, Object>() { @Override public Object apply(@Nullable Map input) { System.out.println("test:" + input); return input; } }); System.out.println(list);`
控制台不显示“test ….”
如何避免懒惰应用
我也试试
List<Map> newList = new ArrayList<Map>(list.size()); Collections.copy(newList,list);
但没有效果
Function
一般不应该有副作用; 那是你真正的问题。
也就是说,如果你坚持立即应用转换,请复制: Lists.newArrayList(Lists.transform(list, function))
。
使用ImmutableList会强制计算值,因此之后不需要额外的副本。 这可能是一个更优雅的解决方案:
list = ImmutableList.copyOf(Lists.transform(list, new Function
为了补充路易斯的答案,你使用Lists.transform()
就好像它修改了原始list
,比如Collections.sort()
。 它没有。
您必须使用Lists.transform()
的返回值来查看发生的事情,请记住它是一个视图 ,每次调用它时都会对其进行评估。 因此,如果你需要多次使用结果,就像路易斯所说,在新的List
( ArrayList
, ImmutableList
等)中做一个副本。