转换时我可以依赖订单吗?
public class DtoFunc implements Function<Entity,DTO>{
Entity previousEntity;
@Override
public DTO apply(Entity entity){
DTO dto = new DTO();
// do transforming
previousEntity = entity;
return dto;
}
}
你可以看到我在我的函数中存储状态,并且当我调用Lists.transform(entityList,new DtoFunc())时它会依赖它,它会随之转换 它按顺序转换吗?我能依靠吗?
正确的答案:转换顺序取决于转换列表的访问权限,因为转换是惰性的。函数必须是无状态的,因为Guava不是线程安全的。
答案 0 :(得分:6)
来自Lists.transform的JavaDoc:
该功能适用于懒惰,需要时调用。
即。如果你这样做:
List<Foo> fooList = newArrayList<Foo>();
// ...
List<Bar> barList = Lists.transform(fooArrayList, fooToBarFunction);
barList.get(5);
然后Guava将从fooList
获取索引为5的元素,对其应用fooToBarFunction
,并将其返回给调用者。其他指数的元素不会被触及。
如果fooList
不是RandomAccessList,则结果可能不同:
List<Foo> fooList = newLinkedList<Foo>();
// ...
List<Bar> barList = Lists.transform(fooArrayList, fooToBarFunction);
barList.get(5);
此调用将通过从元素0迭代到元素5来访问索引为5的元素,可能会为其中的每个元素应用转换函数。
因此,无法保证转换的顺序。但是,如果您可以控制返回列表的访问顺序,并且如果源列表的类型为 RandomAccess
,则fooToBarFunction
的调用顺序完全相同按结果列表上的调用顺序排序。这是从文档中得出的结果,当您访问返回的列表时,该函数被懒惰地应用,并保证返回的列表实现RandomAccess,如果源列表那样。
答案 1 :(得分:1)
来自Javadocs:
返回的列表是
fromList
的转换视图;对fromList
的更改将反映在返回的列表中,反之亦然。
没有明确说明,但我认为这和其他描述意味着订单将被保留。
编辑:此处的关键字是 view :返回的列表由原始文件支持,文档还说明该函数在需要时会延迟应用。所以,是的,订单将是相同的。根据您对列表的要求,Guava甚至建议在某些情况下创建真实副本而不是转换视图可能更明智。