Guava Lists.transform保证订单吗?

idm*_*iev 2 java guava

转换时我可以依赖订单吗?

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不是线程安全的.

nd.*_*nd. 6

从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,如果源列表那样.