guva中的Lists.transform踩坑
Lists.transform能够解决一种类型的list转换为另一种类型的list,特别是对于list中是entity时。
一般的使用方式是为
List<TargetEntity> list = Lists.transform(fromList,new Function<FromEntity,TargetEntity>(){
@Override
public TargetEntity apply(FromEntity input){
...
}
}
踩坑:
场景描述:
service层对从数据库中查出来的list做类型转换为 vo,供前端使用,前端用jsp写,controller返回ModelAndView,jsp中遍历转换后的vo
问题描述:
空指针异常,service中没有catch住异常,controller中没有catch住异常
原因:
因为transform是懒加载机制,所以在service层并没有执行apply中的代码,所以在controller返回给ModelAndView之前是不会抛异常的,在controller返回ModelAndView后,spring会对jsp进行渲染,在渲染的时候遍历list,这时才会执行apply中的代码,所以这时抛异常就不是controller中能catch的,而是Servlet才能catch住的。
Lists.transform介绍:
transform是懒加载机制

其返回了一个TransformingRandomAccessList类型的List,并将原list的地址和对象Function的地址赋值给了fromList,和function。

这表明Lists.transform并不会返回已经转化后的list,而是返回了一个对象TransformingRandomAccessList。
即,只有在使用list中的对象时才会触发TransformingRandomAccessList中的方法。
另一种transform的作用就如mysql中的view,只是对源数据的一层包装,源数据改变,现在的list也会跟着改变。
本文深入探讨了Guava库中Lists.transform方法的懒加载机制导致的空指针异常问题。在服务层对数据库查询结果进行类型转换时,由于transform的延迟执行特性,异常会在前端渲染阶段才被抛出,而非在控制器或服务层捕获。文章详细解释了这一机制及其实现原理。
809

被折叠的 条评论
为什么被折叠?



