Java While循环编码模式

Java While循环编码模式,java,while-loop,Java,While Loop,假设我有这个循环: boolean modified = true; while(modified == true){ modified = false; for (Object o : objectList){ // do logic if (... condition...){ modified = true; } } } 我不喜欢这样,一开始我必须将修改后的变量声明为true。如果在一轮中没有

假设我有这个循环:

boolean modified = true;
while(modified == true){
    modified = false;
    for (Object o : objectList){
        // do logic
        if (... condition...){
            modified = true;
        }
    }
}

我不喜欢这样,一开始我必须将修改后的变量声明为true。如果在一轮中没有更多的修改发生,循环应该终止。

如果我是你,我会像下面这样写逻辑

boolean modified = true;
while (modified) {
    for (Object o : objectList){
        // do logic
        modified = (modified && condition);
    }
}

如果我是你,我会像下面这样写逻辑

boolean modified = true;
while (modified) {
    for (Object o : objectList){
        // do logic
        modified = (modified && condition);
    }
}

下面是一个将
modified
保持在循环范围内的构造,但仍然需要声明:

for (bool modified = false; modified; ) {
    modified = false;
    for (Object o : objectList) {
        modified |= condition; 
        /* If "condition" involves heavy computation, prefer the type of
           condition-checking in @Sazzad's answer, as this will not
           short-circuit to "true" if "modified" is already true. */
    }
}
或者,使用带有标签的
while
循环(尽管标签并不真正属于OO样式):

这将适用于任何嵌套级别

下面是使用do while循环的第三个解决方案:

do {
    for (Object o : objectList) {
        //do stuff    
    }
} while (objectList.stream.anyMatch(/* predicate */));
根据您的情况,您可以使用方法引用使检查非常明显:

objectList.stream().anyMatch(this::condition);

下面是一个将
modified
保持在循环范围内的构造,但仍然需要声明:

for (bool modified = false; modified; ) {
    modified = false;
    for (Object o : objectList) {
        modified |= condition; 
        /* If "condition" involves heavy computation, prefer the type of
           condition-checking in @Sazzad's answer, as this will not
           short-circuit to "true" if "modified" is already true. */
    }
}
或者,使用带有标签的
while
循环(尽管标签并不真正属于OO样式):

这将适用于任何嵌套级别

下面是使用do while循环的第三个解决方案:

do {
    for (Object o : objectList) {
        //do stuff    
    }
} while (objectList.stream.anyMatch(/* predicate */));
根据您的情况,您可以使用方法引用使检查非常明显:

objectList.stream().anyMatch(this::condition);

在Java中,
break
关键字用于此目的,尽管它的使用存在争议,因为它有一种明确的“过程”味道,并且模糊了控制流。你刚才写的东西很常见,它的常见用法让读者明白了它的目的。@JaredFarrish我认为OP想要的是一种省略
modified
声明的方法。这个问题缺少一个语言标签;解决方案可能会根据语言(java vs C++ + javascript)不同。但是,至少在C++和java中,这是。在这些语言中,
modified
必须在循环外声明,但在循环内指定一个值。我编辑了这个问题。修改的属性来自嵌套循环。因此中断是不可能的。在Java中,
break
关键字用于此目的,尽管它的使用存在争议,因为它有一种明确的“过程”味道,并且模糊了控制流。你刚才写的东西很常见,它的常见用法让读者明白了它的目的。@JaredFarrish我认为OP想要的是一种省略
modified
声明的方法。这个问题缺少一个语言标签;解决方案可能会根据语言(java vs C++ + javascript)不同。但是,至少在C++和java中,这是。在这些语言中,
modified
必须在循环外声明,但在循环内指定一个值。我编辑了这个问题。修改的属性来自嵌套循环。所以不可能破译。@Serberker Do while是您的最佳选择@塞伯克Do while是您案例的最佳选择!