迭代ImmutableSet和ImmutableList并改变对象

时间:2016-02-18 10:36:39

标签: java collections guava

我有以下设置(即EntityJPA2权利,entities是一个集合

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
    }
}

我需要通过使用带有value的外部库来转换SubEntity中的List<Doubles>字段,并返回包含已转换值的新列表。之后我需要使用transofmred值更新SubEntity

由于Set没有保留迭代顺序,我首先将其转换为ImmutableSet并使用Collections2.transform创建ImmutableList个值。

ImmutableSet<SubEntity> entities = ImmutableSet.copyOf(entity.getEntities());
ImmutableList<Double> values = ImmutableList.copyOf(Collections2.transform(entities, (e) -> e.getValue())) 

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

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. 当我迭代ImmutableSetSubEntity转换后的值时,我认为值匹配。当我使用不可变集合和List函数?
  3. 时,这是否有保证

1 个答案:

答案 0 :(得分:3)

  1. 是的,除非使用double值计算实体的hashCode,并且该集合使用hashCode。但我真的不明白为什么你在这里使用Set,以及为什么它需要是不可变的。只需使用new ArrayList<>(entity.getEntities())即可获得可靠,一致的迭代顺序。
  2. 是的,因为ImmutableSet的javadoc说:一个高性能,不可变的Set,具有可靠的,用户指定的迭代顺序