gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 09:39:10 25 4
gpt4 key购买 nike

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

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

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

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com