首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在ImmutableSet和ImmutableList上迭代并修改对象

在ImmutableSet和ImmutableList上迭代并修改对象
EN

Stack Overflow用户
提问于 2016-02-18 10:36:38
回答 1查看 3.9K关注 0票数 0

我有以下设置(例如,Entity是一个JPA2实体,entities是一个集合)

代码语言:javascript
运行
复制
class Entity {
    Set<SubEntity> entities = new HashSet<>();
    public Set<SubEntity> getEntities() {
        return entities;
    }
}

class SubEntity {
     Double value;
     // setters and getters ommitted
}

class SomeLibrary {
    public static List<Double> transform(List<Double> values) {
         // transform values and return a new list with transfored values
    }
}

我需要使用外部库转换SubEntity中的SubEntity字段,该库接受一个List<Doubles>,并返回一个包含转换后的值的新列表。之后,我需要用transofmred值更新SubEntity

由于Set不保证迭代顺序,所以我首先将其转换为ImmutableSet,并使用Collections2.transform创建值的ImmutableList

代码语言:javascript
运行
复制
ImmutableSet<SubEntity> entities = ImmutableSet.copyOf(entity.getEntities());
ImmutableList<Double> values = ImmutableList.copyOf(Collections2.transform(entities, (e) -> e.getValue())) 

此时,我假设两个集合中的项(entitiesvalues匹配,就像在压缩两个列表时一样)。

代码语言:javascript
运行
复制
List<Double> transformedValues = SomeLibrary.transform(values);
Iterator<SubEntity> entityIterator = entities.iterator();
Iterator<Double> valueIterator = transformedValues.iterator();
while(entityIterator.hasNext() && valueIterator.hasNext()) {
    SubEntity entity = entityIterator.next();
    Double value = valueIterator.next();
    entity.setValue(value);
}

所以有两个问题:

  1. 在迭代对象的过程中,我能安全地变异一个属于不可变集合的对象的字段吗?
  2. 当我迭代转换值的ImmutableSetList时,我假设这些值是匹配的。当我使用不可变集合和transform函数时,这是否得到保证?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-18 10:45:43

  1. 是的,除非双值用于计算实体的hashCode,并且集合使用hashCode。但我真的不明白你为什么要在这里使用一套,为什么它必须是不可变的。仅仅使用new ArrayList<>(entity.getEntities())就足以获得可靠、一致的迭代顺序。
  2. 是的,因为ImmutableSet的javadoc说:一个高性能、不可变的集合,具有可靠的用户指定的迭代顺序。
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35479056

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档