我在调试器中启动以下代码:
List<MyBean> target = getMyBeans();
Collections2.transform(target, new Function<MyBean, MyBean>() { //BREAKPOINT: target.length equals 4
@Nullable
@Override
public MyBean apply(@Nullable MyBean bean) {
return removeUnnecessaryProperties(bean); //BREAKPOINT: never invoked
}
});
问题: Collections2.transform
永远不会被调用,尽管target
有4个元素。
问题:为什么永远不会调用Collections2.transform
?
答案 0 :(得分:5)
transform
返回一个新的Collection
,仅在需要时转换基础集合中的元素。因此,当您迭代返回的Function
时,target
中的每个元素都会调用一次Collection
。
根据您的代码判断,您真正想做的事情要简单得多(假设removeUnnecessaryProperties
返回传递给它的同一个对象):
for (MyBean bean : target) {
removeUnnecessaryProperties(bean);
}
答案 1 :(得分:2)
Collections2.transform
是一个懒惰的操作。
文档说:
返回的集合是fromCollection的实时视图;改变为 一个影响另一个。
要使其工作,每个元素在访问时都必须进行转换。
尝试使用转换的集合,例如迭代它 - 然后你会看到你的变换方法被调用。