为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

ITMISS 2023-04-26 16:05:50
需要遍历一个复杂的数据结构并从算法中修改外部变量。我试图用流来做,但据我所知它不是线程安全的,可能是竞争条件......有没有比下面复制的方法更好的方法?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);                                    }                                }                            }                        }                    }                }            }        }    }}
查看完整描述

1 回答

?
波斯汪

TA贡献1811条经验 获得超4个赞

当多个线程同时执行修改共享状态的语句时,就会出现竞争条件。

如果您当前的代码是线程安全的,那么在您不使用并行流功能时它仍然会与流一起使用。

关于您的实际代码:我们可以认为它是箭头代码,不易阅读和维护。


你有不同的方法来减少全局嵌套,但我不鼓励在这里使用流,因为你不收集结果,而是改变外部对象。这不是流的用例。


您可以在当前代码中声明您显式地迭代了许多集合,而应用逻辑并不关心其中的大部分。


在这里,所有执行的只是为了获取ObjectG实例,其余的没有使用 then :


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实例并返回它们的方法中。

请注意,它可以在没有流的情况下编写,但也可以使用,因为收集它们不需要修改共享状态。


最后你的方法可以简化为:


Collection<ObjectG> objectsG = collectG(objectA); // extracted method


for (ObjectG objectG : objectsG) {

    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);

        }

    }


查看完整回答
反对 回复 2023-04-26
  • 1 回答
  • 0 关注
  • 59 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信