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

标签 java performance

需要检查复杂的数据结构并修改算法中的外部变量。

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

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

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

最佳答案

当多个线程同时执行修改共享状态的语句时,就会出现竞争条件。
如果您当前的代码是线程安全的,那么当您不使用并行流功能时,它仍然是流式的。
关于您的实际代码:我们可以认为它是一个箭头代码,不容易阅读和维护。

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

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

这里执行的所有操作只是为了获取 ObjectG 实例,其余的不使用:

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

关于java - 如何处理复杂数据结构的嵌套for循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57240226/

相关文章:

MySQL - 以小时和分钟为单位的简单时间的最佳数据类型

android - Honeycomb (TF101) 上的 Canvas /位图和 alpha 混合性能问题

java - 如何在java中检查1是质数并且Hashmap的输出对于String类型是错误的

Impala 的 Java 时间戳到 BigInt

java - java.lang.NoClassDefFoundError:用于gradle JUNIT测试的scala/Product $ class

Jquery 差异 .html ("") 与 .empty()

用于获取对象值的有序数组的 Javascript (lodash) 函数

performance - 需要将人声转换为音符

java - 将byte[]中的加密图像转换为java中的BufferedImage而不解密

java - 不关闭 InputStream 时是否存在内存泄漏?