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);
}
}
添加回答
举报