转换时我可以依赖订单吗?
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;
}
}
Run Code Online (Sandbox Code Playgroud)
正如你可以看到我在我的函数中存储状态,并且我依赖于当我调用Lists.transform(entityList,new DtoFunc())时它会随之转换.它是否按顺序转换?我可以依靠它吗?
正确的答案:转换顺序取决于转换列表的访问权限,因为转换是惰性的.函数必须是无状态的,因为Guava不是线程安全的.
从JavaDoc for Lists.transform:
该函数被懒惰地应用,在需要时调用.
即如果你这样做:
List<Foo> fooList = newArrayList<Foo>();
// ...
List<Bar> barList = Lists.transform(fooArrayList, fooToBarFunction);
barList.get(5);
Run Code Online (Sandbox Code Playgroud)
然后Guava将获得索引为5的元素fooList,应用于fooToBarFunction它,并将其返回给调用者.不会触及其他指数的元素.
如果fooList不是RandomAccessList,则结果可能不同:
List<Foo> fooList = newLinkedList<Foo>();
// ...
List<Bar> barList = Lists.transform(fooArrayList, fooToBarFunction);
barList.get(5);
Run Code Online (Sandbox Code Playgroud)
该调用将通过从元素0迭代到元素5来访问具有索引5的元素,可能对其间的每个元素应用变换函数.
因此,不能保证转换的顺序.但是,如果您可以控制返回列表的访问顺序,并且源列表是类型, RandomAccess则调用fooToBarFunction顺序与结果列表上的调用顺序完全相同.这是从文档中得出的结果,当您访问返回的列表时,该函数被懒惰地应用,并且保证返回的列表实现RandomAccess,如果源列表那样.