操作到"获取和AND" Java中的布尔变量

时间:2015-07-20 10:26:29

标签: java

在Java中是否可以使用类似(i++++i)的语法作为布尔逻辑运算符?

我有一个布尔变量,仅对foreach循环的第一次迭代才为真。必须跳过那次迭代。

完整语法是

for (...)
{
    if (bool)
    {
        bool &= false;
        continue;
    }
}

我想知道是否有办法缩短语法而不使用AtomicBoolean 。例如,构造if (bool &= false)在语法上是正确的,但我认为它将比较最终结果而不是原始值。

Google不是我的朋友,因为搜索查询具有误导性

7 个答案:

答案 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();
    }
}