在调用Guava Lists.transform进行转换 & 封装对象时,获得transform返回的数组对象后,随后进行遍历并对数组元素属性进行赋值,当遍历结束后数组对象会出现赋值丢失。
public static void main(String[] args) {
List list = new ArrayList<>();
list.add(new BookA());
List transform = Lists.transform(list, new Function() {
@Override
public @Nullable BookB apply(@Nullable BookA bookA) {
BookB bookB = new BookB();
return bookB;
}
});
transform.forEach(v->{
v.setA(1);
v.setType(1);
});
System.out.println(transform);
}
Transform执行结果:
2. 原因Lists.transform只是新创建了一个Guava实现了AbstractList的类,并不是返回一个转换后新数组,而我们在每次遍历transform数组时都会运行 Lists.transform中的funtion方法,因此我们在运行foreach中对数组元素进行赋值时,在会在当前循环有效。当foreach循环完毕在执行输出transform数组对象时,只会重新执行Lists.transform中的funtion方法,因而foreach中赋值操作会直接丢失。
3. 解决方案推荐使用JAVA Stream。
4. FAQ 5. 参考资料【">Guava Lists.transform踩坑小记<转>】



