【问题标题】:Calling a method in the while loop condition在 while 循环条件中调用方法
【发布时间】:2016-11-22 09:51:39
【问题描述】:

我很好奇是否可以在 while 循环的条件部分调用返回布尔值的方法?

如:

    while(someMethod()!= true){
          //Do stuff
    }

并且该方法只返回一个真或假。这是否可能,如果是,是否有正确的语法或更好的方法?

编辑:感谢您的快速回复。作为对我的问题的扩展,是否可以针对不同的事物多次调用该方法,但在退出循环之前要求它们都相同?

例如:

while(!(someMethod(input_a) == someMethod(input_b))){
    //Do stuff
}

哪里两个返回值都相等?

【问题讨论】:

  • 有可能,而且你基本上是对的,尽管while(!someMethod()) 会更传统。
  • 你真的尝试过这样做吗?这是确定某事是否可能的最简单方法。如果您发现不是,那么您可以在问题中发布实际错误。
  • @AndyTurner 我有,但它似乎没有按预期工作。这段代码应该是战舰游戏的一部分,而这个 while 循环旨在测试两艘船是否重叠。它似乎不像我想要的那样工作,即船只相互重叠。问题是只有当我尝试在 while 循环中多次调用该方法时才会出现问题。

标签: java while-loop


【解决方案1】:

希望对你有帮助

public boolean functionOne(int i){
   // some operation
   if(i == 1) return true;
   else return false;
}

public void otherFunc(){
   int i = 0;
   if(functionOne(i)) { // e.g: if(functionOne(i) == true)
      // your code
      // 0!=1 so result is fort 
   }
   if(!functionOne(i)){ // e.g: if(functionOne(i) == false) 
     // your code
     // 0!=1 it is false, but ! before functionOne negate so ! of false is true
   } 

   // **for your while**
   while(functionOne(i)){ // while function returns true
    // code 
   }
   // **or**
   while(!functionOne(i)){ // while function returns false
    // code 
   }
}

【讨论】:

  • 当然,在您的简单示例中,else 会更好。我知道您只是出于教育目的而展示。
  • 是的,你说的应该还有其他的:)
【解决方案2】:

当然可以!

public static boolean someMethod(){
    return false;
}

public static void main(String[] args){
    while(!someMethod()){
        //do something
        System.out.println("Hi");
     }
  }

就像在这段代码中,如果方法返回 false 将调用一个无限循环,但如果方法返回 true,它将刚刚退出 while 循环。 :)

【讨论】:

    【解决方案3】:

    少即是好:

    while (!someMethod()) {
        // Do stuff
    }
    

    将布尔结果与布尔文字进行比较绝不是一个好主意。首选使用内联结果,根据需要使用逻辑一元非运算符!


    回答现在已编辑的问题,少即是好:

    while (someMethod(input_a) != someMethod(input_b))
    

    【讨论】:

    • 它真的会对性能产生影响,还是仅仅因为它是不必要的混乱而不符合惯例?
    • @Gendarme 主要是杂乱无章,但也是一种避免阴险的“意外分配”错误的风格:将if (a == true)if (a = true) 进行比较。既编译又执行,但其中一个显然是一个错误。尽管您不能分配给方法结果,但始终遵循这种风格只是一种好习惯。您应该将其扩展为更喜欢 return myBooleanMethod(); 而不是 if (myBooleanMethod()) return true; else return false;
    【解决方案4】:

    你可以在JLS Sec 14.12找到while循环的规范:

    while 语句重复执行一个 Expression 和一个 Statement,直到 Expression 的值为 false。

    WhileStatement:
        while ( Expression ) Statement
    WhileStatementNoShortIf:
        while ( Expression ) StatementNoShortIf
    

    表达式的类型必须为 boolean 或 Boolean,否则会发生编译时错误。

    因此,您可以使用任何类型为 boolean(或 Boolean)的 Expression

    如果您点击语言规范中的作品:

    呸!埋得很深啊! (您可以将其视为继承层次结构,因此每个MethodInvocation 都是PrimaryNoNewArray,每个PrimaryNoNewArray 都是Primary 等)。

    因此,每个MethodInvocation 都是一个Expression,因此可以将其用作while 循环中的表达式。


    解决您的编辑问题:是的,这也很好。如果您查看EqualityExpression的详细信息:

    EqualityExpression:
        RelationalExpression 
        EqualityExpression == RelationalExpression 
        EqualityExpression != RelationalExpression
    

    如上所述,您可以将EqualityExpression 用作WhileStatement 中的Expression。还有一些形式

    RelationalExpression != RelationalExpression
    

    按照所示规则是EqualityExpression。由于所有 MethodInvocations 都是 RelationalExpressions,因此您可以在 while 语句中使用方法调用,如您所示:

    while(someMethod(input_a) != someMethod(input_b)) {
    

    a != b 是写!(a == b) 的一种更简单的方式)。

    【讨论】:

      【解决方案5】:

      这是我们在 java 迭代器上完成循环的方式。例如:

      Iterator[String] iterator = util.Arrays.asList("One", "Two", "Three").iterator();
      while(iterator.hasNext()) {
          println(iterator.next());
      }
      

      我们也为 JDBC ResultSet 接口做了类似的事情。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-12-07
        • 2012-09-14
        • 2013-12-22
        • 2015-02-27
        • 1970-01-01
        • 1970-01-01
        • 2010-11-11
        • 2012-02-14
        相关资源
        最近更新 更多