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);
}
}
添加回答
舉報