Eclipse 让我可以编写一些这样的代码,并且不会显示任何错误:
for (SomeClass c : listOfSomeClass) if (c.someBoolean) {
// actions to take if someBoolean is true
}
这会按预期运行,还是不是有效的 Java?
Eclipse 让我可以编写一些这样的代码,并且不会显示任何错误:
for (SomeClass c : listOfSomeClass) if (c.someBoolean) {
// actions to take if someBoolean is true
}
这会按预期运行,还是不是有效的 Java?
这是有效的。将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);
}
}
它工作正常,但格式可能会令人困惑。即使你不确定它会做什么。我建议你在 eclipse 中使用标准格式化程序来生成类似的东西
for (SomeClass c : listOfSomeClass)
if (c.someBoolean) {
// actions to take if someBoolean is true
}
是的,它可以完成,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");
这是有效的 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);
请注意,通常不鼓励使用这种样式,因为它可能会导致对代码功能的误解。
非正式地,该for
构造具有以下语法:
for (...)
陈述
通常,语句将采用一{
组指令的形式,每个指令由; }
但是,当然,可以省略单个语句的大括号。
由于if (
...){ }
是一个语句,因此您的代码是有效的。
但它是晦涩难懂的:至少要遵守既定的惯例,并if
以额外的缩进级别在下一行开始。我在编写循环时总是for
使用大括号,但这是个人选择,许多受人尊敬的编码人员不这样做。
这是有效的。如果不使用大括号“{”,则只执行第一个命令。例如,如果您在“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");
}
但是,建议使用块语句。
如果你想在循环中执行多行,那么你可以这样写
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
如果您查看 Java 语言规范,for
您会看到(对于增强的 for):
for ( FormalParameter : Expression ) Statement
Statement的定义是:
Statement: StatementWithoutTrailingSubstatement ... IfThenStatement ... StatementWithoutTrailingSubstatement: Block ...
(我省略了一些定义)
换句话说,您问题中的陈述等同于for ( FormalParameter : Expression ) Statement
where 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
}
}