如何处理具有复杂数据结构的嵌套 for 循环?

需要遍历一个复杂的数据结构并从算法中修改外部变量。


我试图用流来做,但据我所知它不是线程安全的,可能是竞争条件......


有没有比下面复制的方法更好的方法?


List<ObjectA> externalVariable = new ArrayList<>();

List<ObjectA> externalVariable2 = new ArrayList<>();


if (objectA != null) {

    externalVariable.add(objectA);


    for (ObjectB objectB : objectA) {

        if (objectB.getObjectC() != null) {

            for (ObjectD objectD : objectB.getObjectC()) {

                if (objectD.getObjectE() != null) {

                    for (ObjectE objectE : objectD.getObjectE()) {

                        if (objectE.getObjectF() != null) {

                            for (ObjectG objectG : objectE.getObjectF()) {

                                objectG.setSomething("BlaBla");


                                if (objectG.getOjectH() != null && objectG.getOjectH().getObjectI() != null) {

                                    for (ObjectI objectI : objectG.getOjectH().getObjectI()) {

                                        externalVariable2.add(objectI);

                                        ObjectJ objectJ = getRelevantOjectJ(objectA.getId(), objectI.getId());

                                        objectI.setObjectJ(objectJ);

                                    }

                                }

                            }

                        }

                    }

                }

            }

        }

    }

}


ITMISS
浏览 79回答 1
1回答

波斯汪

当多个线程同时执行修改共享状态的语句时,就会出现竞争条件。如果您当前的代码是线程安全的,那么在您不使用并行流功能时它仍然会与流一起使用。关于您的实际代码:我们可以认为它是箭头代码,不易阅读和维护。你有不同的方法来减少全局嵌套,但我不鼓励在这里使用流,因为你不收集结果,而是改变外部对象。这不是流的用例。您可以在当前代码中声明您显式地迭代了许多集合,而应用逻辑并不关心其中的大部分。在这里,所有执行的只是为了获取ObjectG实例,其余的没有使用 then :for (ObjectB objectB : objectA) {&nbsp; &nbsp; if (objectB.getObjectC() != null) {&nbsp; &nbsp; &nbsp; &nbsp; for (ObjectD objectD : objectB.getObjectC()) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (objectD.getObjectE() != null) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for (ObjectE objectE : objectD.getObjectE()) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (objectE.getObjectF() != null) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for (ObjectG objectG : objectE.getObjectF()) {因此,将所有这些封装到一个收集ObjectG实例并返回它们的方法中。请注意,它可以在没有流的情况下编写,但也可以使用,因为收集它们不需要修改共享状态。最后你的方法可以简化为:Collection<ObjectG> objectsG = collectG(objectA); // extracted methodfor (ObjectG objectG : objectsG) {&nbsp; &nbsp; objectG.setSomething("BlaBla");&nbsp; &nbsp; if (objectG.getOjectH() != null && objectG.getOjectH().getObjectI() != null) {&nbsp; &nbsp; &nbsp; &nbsp; for (ObjectI objectI : objectG.getOjectH().getObjectI()) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; externalVariable2.add(objectI);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ObjectJ objectJ = getRelevantOjectJ(objectA.getId(), objectI.getId());&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; objectI.setObjectJ(objectJ);&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java