Guava Lists.transform保证订单吗?

时间:2014-10-10 08:33:21

标签: 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;
    }
}

你可以看到我在我的函数中存储状态,并且当我调用Lists.transform(entityList,new DtoFunc())时它会依赖它,它会随之转换 它按顺序转换吗?我能依靠吗?

正确的答案:转换顺序取决于转换列表的访问权限,因为转换是惰性的。函数必须是无状态的,因为Guava不是线程安全的。

2 个答案:

答案 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甚至建议在某些情况下创建真实副本而不是转换视图可能更明智。