【问题标题】:adding elements while iterating [duplicate]在迭代时添加元素[重复]
【发布时间】:2021-12-02 05:29:23
【问题描述】:

我有一个具体对象的列表。在遍历这个列表时,我试图通过添加值来更新一个对象,当然我得到了一个 ConcurentModificationException: 我的替代方案是什么?谢谢并感谢您的帮助。我正在使用 Java 11。

import lombok.Data;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Objects;

public class Test {

    public static void main(String[] args) throws IOException {

        List<Person> myList = new ArrayList<>();
        List<Hobby> hobbies = new ArrayList<>();
        Hobby h1 = new Hobby("SKI");
        Hobby h2 = new Hobby("reading");
        hobbies.add(h1);
        hobbies.add(h2);
        Person p = new Person("R", hobbies);

        Person p1 = new Person("M", hobbies);

        myList.add(p);
        myList.add(p1);
        myList
                .forEach(currentElement -> {
                    if (Objects.isNull(currentElement.getHobbies())) {
                        currentElement.setHobbies(Collections.singletonList(new Hobby("NOTHING")));

                    } else {
                        currentElement.getHobbies()
                                .forEach(hobby -> {
                                    if (hobby.getMyHobby().equals("SKI")) {
                                        currentElement.getHobbies().add(new Hobby("SAILING"));
                                    } else {
                                        hobby.getMyHobby().toLowerCase();
                                    }
                                });
                    }
                });
    }

    @Data
    static
    class Person {
        String name;
        List<Hobby> hobbies;

        public Person(String name, List<Hobby> hobbies) {
            this.name = name;
            this.hobbies = hobbies;
        }
    }

    @Data
    static class Hobby {
        String myHobby;

        public Hobby(String myHobby) {
            this.myHobby = myHobby;
        }
    }
}

【问题讨论】:

  • 我会质疑使用forEach(...) 的决定。 lambda 构造使代码难以阅读。
  • Java 不喜欢这样修改 foreach 循环中的列表元素,您可能希望使用 ListIterator
  • hobby.getMyHobby().toLowerCase(); 应该做什么?
  • 这只是我为我的真实案例代码添加的一个示例
  • @freecoderw 如果找到SKI 爱好;您要添加SAILING 并保留两者还是将SKI 替换为SAILING

标签: java java-stream


【解决方案1】:

您可以改为迭代索引:

for (int i = 0; i < currentElement.getHobbies().size(); i++) {
    Hobby hobby = currentElement.getHobbies().get(i);
    if (hobby.getMyHobby().equals("SKI")) {
        currentElement.getHobbies().add(new Hobby("SAILING"));
    } else {
        hobby.getMyHobby().toLowerCase();  // sic
    }
}

【讨论】:

  • 如果还有另一种使用流的可能性,我不想采用老式的方式......
  • 流通常不应修改其数据源。而且你无论如何都没有使用流。
  • 不错,只是希望能用
猜你喜欢
  • 2020-04-22
  • 2011-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-15
  • 2013-01-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多