【问题标题】:RxJava custom ArrayList changes reference list alsoRxJava 自定义 ArrayList 也更改了参考列表
【发布时间】:2017-12-01 07:35:20
【问题描述】:

结构

Class Dogs extends RealmObject{
    private RealmList<Cats> cats;
}

dogList 包含cats 的非空列表。 我正在尝试将猫/集删除为空列表,但结果也会影响父列表。

 protected void removeCatsFromDogs(ArrayList<Dogs> dogList) {
   ArrayList<Dogs> newList = new  ArrayList<>(dogList);

    Observable.fromIterable(newList)
            .map(dogs ->
                    {
                        dogs.setCats(null);
                        // dogs.setCats(new RealmList<>()); also not working
                        return dogs;
                    }
            ).toList()
            .doOnSuccess(dogs -> baseRealm.executeTransaction(realm -> baseRealm.copyToRealmOrUpdate(dogs)))
            .subscribe();


}

doOnSuccess 返回 dogsnull 列表,但它也反映在原始列表中。

我也尝试过使用 for 循环一个一个地复制对象,但仍然是同样的问题。

【问题讨论】:

  • 你到底想完成什么?
  • @ChristianMelchior 我已经更新了我的问题。总之,我不想对dogList(函数参数)做任何改变
  • 所以你有一个不受管理的dogList(有猫),但你想更新领域中的所有狗,以删除他们所有的猫,所有这一切都不会影响你原来的@987654330 @?
  • 是的@ChristianMelchior。正是

标签: android arraylist realm rx-java rx-java2


【解决方案1】:

如上所述,您需要使用要复制的属性手动创建对象的副本。像这样的东西应该可以工作:

public class Dogs extends RealmObject {
    public String name;
    public RealmList<Cats> cats;

    public static Dogs shallowCopy(Dogs dogs) {
        Dogs copy = new Dogs();
        copy.name = dogs.name;
        return copy;
    }
}


protected void removeCatsFromDogs(ArrayList<Dogs> dogList) {
    ArrayList<Dogs> newList = new  ArrayList<>(dogList);
    Observable.fromIterable(newList)
        .map(dogs -> { return Dogs.shallowCopy(dogs); })
        .toList()
        .doOnSuccess(dogs -> baseRealm.executeTransaction(realm -> baseRealm.copyToRealmOrUpdate(dogs)))
        .subscribe();
}

【讨论】:

  • 这可能是更好的方法,而不是迭代 for 循环并创建对象。
【解决方案2】:

您需要在您的map() 操作中创建一个新的Dog。新的Dog 将有cats 为空,大概。

因为您将对象作为参数传入,所以会更改传入的值。这就是 Java 参数传递的工作原理。

【讨论】:

  • 这就是我已经通过创建狗对象并在新列表中单独添加所做的事情。即没有使用传统的 for 循环对原始版本进行修改。
  • 在您的原始帖子中,您没有创建新的Dogs。您正在使用传入的Dogs
  • 检查我更新的问题。我正在创建dogList 的完整副本。
  • 问题文本仍然显示您正在处理一个列表,一次一个项目,修改一个项目,然后将它们重新组合成一个新列表。我的观点是你正在改变原来的Dogs,我的观点仍然成立。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-23
  • 2011-02-14
  • 2011-10-12
  • 1970-01-01
相关资源
最近更新 更多