亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何處理具有復雜數據結構的嵌套 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 關注
  • 104 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號