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也会跟着改变。