在Java中是否可以使用类似(i++
,++i
)的语法作为布尔逻辑运算符?
我有一个布尔变量,仅对foreach
循环的第一次迭代才为真。必须跳过那次迭代。
完整语法是
for (...)
{
if (bool)
{
bool &= false;
continue;
}
}
我想知道是否有办法缩短语法而不使用AtomicBoolean
。例如,构造if (bool &= false)
在语法上是正确的,但我认为它将比较最终结果而不是原始值。
Google不是我的朋友,因为搜索查询具有误导性
答案 0 :(得分:51)
就个人而言,我会将您当前的代码简化为:
for (...)
{
if (bool)
{
bool = false;
continue;
}
// Rest of code
}
...但如果您确实希望在if
条件下执行副作用,您可以使用:
for (...)
{
if (bool && !(bool = false))
{
continue;
}
// Rest of code
}
此处&&
运算符的第一个操作数涵盖后续操作,!(bool = false)
将始终评估为true
和将bool
设置为false
另一种选择,来自评论:
for (...)
{
if (bool | (bool = false))
{
continue;
}
// Rest of code
}
这会在每次迭代时执行赋值,但每次都会给出正确的结果。
我真的,真的不会使用这两个选项中的任何一个。
答案 1 :(得分:22)
您的代码是常见的事情。但是,还有另一种选择:
for (SomeType thing : Iterables.skip(things, 1)) {
// process thing
}
这使用Google Guava的Iterables.skip()
方法并生成您期望的输出 - 每个循环遍历集合并跳过第一个元素。
答案 2 :(得分:7)
或者,只需使用整数变量并使用++
对其进行后递增。
int iter = 0;
for (...) {
if (iter++ == 0) {
continue;
}
...
}
如果您想跳过第一次迭代,这可能更容易理解。
答案 3 :(得分:5)
不要对布尔类型使用增量如果必须使用布尔值,请切换它,例如jQuery.fn.center = function(pos){
if (! pos)
pos = 'fixed';
var w = jQuery(window);
this.css("position", pos);
if ('fixed' == pos){
this.css("top" , (w.height()-this.height())/2 + "px");
this.css("left", (w.width()-this.width()) /2 + "px");
} else if ('absolute' == pos){
this.css("top",(w.height()-this.height())/2+w.scrollTop() + "px");
if(w.height() < this.height())
this.css("top", w.scrollTop() + "px");
this.css("left",(w.width()-this.width())/2+w.scrollLeft() + "px");
}
return this;
}
,或者只将其设置为false:
LastPrice: DLookUp("[FieldWithPrice]";"[tblFunds_TS_Data]";"[Date]=DMax('[Date]','[tblFunds_TS_Data]')")
理想情况下,如果你想要的只是跳过第一次,最后一次或第n次迭代,那么除了int之外不要使用布尔值......
!bool
...或以下内容仅跳过第一次迭代:
for (...){
if (bool) {
bool = false;
continue;
}
}
答案 4 :(得分:4)
如果(并且仅当)您确实始终需要继续第一次迭代,为什么不跳过该迭代?不是从i=0
开始,而是从
for(i=1....
答案 5 :(得分:4)
在bool &= false;
显然会做的时候,我一直在努力去理解为什么OP试图使用bool = false
。从这个意义上讲, Jon Skeet 的答案(不出所料)是正确的。
我认为OP实际上想要做的是将变量设置为false并一步测试它。这是引用AtomicBoolean
的原因。它与循环没什么关系。 IE他想做同样的事情:
int a=0;
for ( ... ) {
if (a++ == 0 ) { // works if we aren't doing too many iterations
continue;
}
...
}
即。他希望相当于一个后增量算子。
如果我是对的,那不是他所担心的循环,那就是a
这里被读了一次,然后再单独阅读
这是过早优化的情况。 Java编译器很可能(我没有经过测试)生成单个读取和测试以及代码
boolean a=false;
for ( ... ) {
if (!a) {
a = true;
continue;
}
}
Jon Skeet 建议。
答案(为了完整性)是没有适用于boolean
的后增量运算符,我无法确定如何定义一个函数,而不至少提及变量两次。但是,这不应该是一个设计考虑因素。
请注意,您可以执行真正的for
循环:
int i;
boolean skip;
for (i=0, skip=true; i<10; i++, skip=false) {
if (skip)
continue;
}
答案 6 :(得分:0)
for (int i = 0, boolean doIt = false; i < 10; i++, doit = true) {
if (doIt) {
doStuff();
}
}