gpt4 book ai didi

java - 迭代 ImmutableSet 和 ImmutableList 并改变对象

转载 作者:行者123 更新时间:2023-12-01 21:48:59 30 4
gpt4 key购买 nike

我有以下设置(即 Entity 是一个 JPA2 实体,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> 的外部库并返回一个包含转换后的值的新列表。之后我需要更新SubEntity与转换值。

因为Set不保证迭代顺序我首先将其转换为 ImmutableSet并使用Collections2.transform创建 ImmutableList的值(value)观。

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对于转换后的值,我假设这些值是匹配的。当我使用不可变集合和 transform 时,这是有保证的吗?功能?

最佳答案

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

关于java - 迭代 ImmutableSet 和 ImmutableList 并改变对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35479056/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com