4

Eclipse 让我可以编写一些这样的代码,并且不会显示任何错误:

for (SomeClass c : listOfSomeClass) if (c.someBoolean) {
    // actions to take if someBoolean is true
}

这会按预期运行,还是不是有效的 Java?

4

8 回答 8

8

这是有效的。将if重复与 的元素一样多的次数listOfSomeClass。但这并不意味着像这样编写 Java 是一个好主意。请永远不要这样做。

你甚至可以写类似

for (SomeClass c : listOfSomeClass) if (c.someBoolean) System.out.println(c);

如果你感觉特别反常。

但是,当您编写代码时,编写其他程序员可以轻松阅读、理解和在必要时修改的代码很重要。一旦软件系统投入生产,您可以相当确定在将来的某个时候需要对其进行更改。您无法确定的是这些变化究竟会是什么。

因此,一个好的程序员,一个专业的程序员,以一种尽可能容易改变的方式编写他/她的代码;这意味着尽可能容易理解。现在,我们专业的程序员已经习惯了看到以某种方式布局的代码。for与和 一起使用的花括号if,无论它们是否实际需要。一致的缩进。变量名的直观使用等等。任何稍微不寻常的事情都会让我们慢下来。

我不想挠头,试图弄清楚代码是如何工作的。我不想考虑哪些行是for循环或if分支的一部分。我想要在我第一次看到它时告诉我它做什么的代码。所以,如果你曾经和我在同一个团队——或者和任何有点像我的程序员在同一个团队——那么为了这个世界上所有美好事物的热爱,请完全像这样编写这个循环。

for (SomeClass element : listOfSomeClass) {
    if (element.shouldBePrinted()) {
        System.out.println(element);
    }
}
于 2013-11-08T08:29:15.107 回答
5

它工作正常,但格式可能会令人困惑。即使你不确定它会做什么。我建议你在 eclipse 中使用标准格式化程序来生成类似的东西

for (SomeClass c : listOfSomeClass) 
    if (c.someBoolean) {
        // actions to take if someBoolean is true
    }
于 2013-11-08T08:30:05.353 回答
2

是的,它可以完成,if循环

if (c.someBoolean) {
    // actions to take if someBoolean is true
}

将被执行多次

将执行 for 循环后立即出现的内容。例如

for(int i=0;i<10;i++)
System.out.println("welcome");

 for(int i=0;i<10;i++)
{
    System.out.println("welcome");
}

所以它会打印欢迎 10 次。

但是这个例子

F

or(int i=0;i<10;i++)
    System.out.println("welcome");
    System.out.println("outside");

将打印欢迎 10 次和外部 1 次。上面的代码类似于

for(int i=0;i<10;i++)
{
    System.out.println("welcome");
}
    System.out.println("outside");
于 2013-11-08T08:30:10.830 回答
2

这是有效的 Java 代码,与以下内容相同:

for (SomeClass c : listOfSomeClass) {
    if (c.someBoolean) {
        // actions to take if someBoolean is true
    } 
}

实际上,Java 允许您在 for 循环条件之后编写一行语句。例子:

for (int i = 0; i < 10; i++)
    System.out.println(i);

请注意,通常不鼓励使用这种样式,因为它可能会导致对代码功能的误解。

于 2013-11-08T08:30:41.860 回答
2

非正式地,该for构造具有以下语法:

for (...) 陈述

通常,语句将采用一{组指令的形式,每个指令由; }但是,当然,可以省略单个语句的大括号。

由于if (...){ } 一个语句,因此您的代码是有效的

但它是晦涩难懂的:至少要遵守既定的惯例,并if以额外的缩进级别在下一行开始。我在编写循环时总是for使用大括号,但这是个人选择,许多受人尊敬的编码人员不这样做。

于 2013-11-08T08:35:37.650 回答
0

这是有效的。如果不使用大括号“{”,则只执行第一个命令。例如,如果您在“if”块之后有另一个命令,它就不会成为“for”循环的一部分。

例子:

for (int i=0; i<3; i++)
    System.out.println(i);
System.out.println("Hello");

将打印:

0
1
2
Hello

不是

0
Hello
1
Hello
2
Hello

如果您有以下代码,将打印第二个输出:

for (int i=0; i<3; i++) {
    System.out.println(i);
    System.out.println("Hello");
}

但是,建议使用块语句。

于 2013-11-08T08:35:43.520 回答
0

如果你想在循环中执行多行,那么你可以这样写

for (SomeClass c : listOfSomeClass)  
{
    //multiple lines to be executed
    System.out.println("print this awesome line");
}

现在,如果您只想根据循环执行单行代码,那么您可以这样编写

for (SomeClass c : listOfSomeClass)  
    System.out.println("print this awesome line");

现在这一行可以是任何有效的代码行,因此如果条件也允许

if(awesomeCondition)
{
    System.out.println("print this awesome line in side legendary if condition");
}

因此你的最终代码是

for (SomeClass c : listOfSomeClass)  
if(awesomeCondition)
{
    System.out.println("print this awesome line in side legendary if condition");
}

这同样兼容

for (SomeClass c : listOfSomeClass)  
{
    if(awesomeCondition)
    {
        System.out.println("print this awesome line in side legendary if condition");
    }// end of IF block
}// end of for loop
于 2013-11-08T08:45:43.757 回答
0

如果您查看 Java 语言规范,for您会看到(对于增强的 for):

for ( FormalParameter : Expression ) Statement

Statement的定义是:

Statement:
    StatementWithoutTrailingSubstatement
    ...
    IfThenStatement
    ...

StatementWithoutTrailingSubstatement:
    Block
    ...

(我省略了一些定义)

换句话说,您问题中的陈述等同于for ( FormalParameter : Expression ) Statementwhere Statement: IfThenStatement

现在通常建议使用 aBlock代替,或者至少使用 indent 以获得更好的可读性。您的声明相当于:

for (SomeClass c : listOfSomeClass) 
    if (c.someBoolean) {
        // actions to take if someBoolean is true
    }

或者更好:

for (SomeClass c : listOfSomeClass) {
    if (c.someBoolean) {
        // actions to take if someBoolean is true
    }
}
于 2013-11-08T08:51:47.053 回答