冒号 (:) 运算符有啥作用?
Posted
技术标签:
【中文标题】冒号 (:) 运算符有啥作用?【英文标题】:What does the colon (:) operator do?冒号 (:) 运算符有什么作用? 【发布时间】:2011-01-24 20:51:57 【问题描述】:显然,冒号在 Java 中以多种方式使用。有人介意解释一下它的作用吗?
例如这里:
String cardString = "";
for (PlayingCard c : this.list) // <--
cardString += c + "\n";
你会如何写这个for-each
循环以不包含:
?
【问题讨论】:
其他人已经提到这种情况是一个for-each循环。有关其工作原理的更详细说明,请参阅java.sun.com/j2se/1.5.0/docs/guide/language/foreach.html 【参考方案1】:由于大多数 for 循环非常相似,Java 提供了一种快捷方式来减少 编写称为 for each 循环的循环所需的代码量。
以下是每个循环的简明示例:
for (Integer grade : quizGrades)
System.out.println(grade);
在上面的示例中,冒号 (:) 可以读作“in”。对于每个循环 完全可以理解为“对于每个整数元素(称为等级) quizGrades,打印出成绩的数值。”
【讨论】:
【参考方案2】:它将打印字符串“something”三次。
JLabel[] labels = new JLabel(), new JLabel(), new JLabel();
for ( JLabel label : labels )
label.setText("something");
panel.add(label);
【讨论】:
这就是上面所说的 ForEach 循环【参考方案3】:冒号在 for-each 循环中使用, 试试这个例子,
import java.util.*;
class ForEachLoop
public static void main(String args[])
`enter code here`
Integer[] iray=1,2,3,4,5;
String[] sray="ENRIQUE IGLESIAS";
printME(iray);
printME(sray);
public static void printME(Integer[] i)
for(Integer x:i)
System.out.println(x);
public static void printME(String[] i)
for(String x:i)
System.out.println(x);
【讨论】:
【参考方案4】:在Java代码中有几个地方使用了冒号:
1)跳出标签(Tutorial):
label: for (int i = 0; i < x; i++)
for (int j = 0; j < i; j++)
if (something(i, j)) break label; // jumps out of the i loop
// i.e. jumps to here
2)三元条件(Tutorial):
int a = (b < 4)? 7: 8; // if b < 4, set a to 7, else set a to 8
3) For-each 循环 (Tutorial):
String[] ss = "hi", "there"
for (String s: ss)
print(s); // output "hi" , and "there" on the next iteration
4) 断言 (Guide):
int a = factorial(b);
assert a >= 0: "factorial may not be less than 0"; // throws an AssertionError with the message if the condition evaluates to false
5) switch 语句中的大小写 (Tutorial):
switch (type)
case WHITESPACE:
case RETURN:
break;
case NUMBER:
print("got number: " + value);
break;
default:
print("syntax error");
6) 方法引用 (Tutorial)
class Person
public static int compareByAge(Person a, Person b)
return a.birthday.compareTo(b.birthday);
Arrays.sort(persons, Person::compareByAge);
【讨论】:
很好 - 我错过了一些!我什至不知道你可以命名这样的断言,非常有用。 来自 .NET (C#),与所讨论的结构最接近的类比是 for-each,您对此进行了很好的解释。 失败的assert
不会“退出程序”。它抛出一个AssertionError
。只有当它被扔到唯一剩余的非守护线程的堆栈上并且没有被捕获时,它才会导致程序退出。
如果你的目标是包含所有,那么我会添加双冒号 (::) 运算符
另外,方法引用中使用了双冒号。【参考方案5】:
您将如何以不同的方式编写此 for-each 循环,以免包含“:”?
假设list
是Collection
实例...
public String toString()
String cardString = "";
for (Iterator<PlayingCard> it = this.list.iterator(); it.hasNext(); /**/)
PlayingCard c = it.next();
cardString = cardString + c + "\n";
我应该补充一点,:
在这种情况下不是运算符。运算符在表达式中执行操作,而 for
语句中的 ( ... )
中的内容不是表达式……根据 JLS。
【讨论】:
我的问题是:为什么?为什么要做同样的事情? @RichN - 他不想这样做,他只想知道怎么做。 不是作业,我想知道怎么做,这样我才能理解逻辑 其实在我(糟糕的)大学,在计算机工程学习期间,他们从来没有教过我们关于java课程中的(:)的任何东西,我后来通过看例子来学习它,不幸的是,它我现在很难把它写进我的脑海里,因为我在大学里做了所有的项目 你不需要假设list
是Collection
的一个实例;如果它能够在增强的 for 循环中使用,它必须是 Iterable
的一个实例,这意味着它将具有您在答案中调用它的 iterator()
方法。【参考方案6】:
补充一点,当在for-each循环中使用时,“:”基本上可以读作“in”。
所以
for (String name : names)
// remainder omitted
应该读作“对于每个名字 IN names do ...”
【讨论】:
【参考方案7】:你通常在三元赋值运算符中看到它;
语法
variable = `condition ? result 1 : result 2;`
示例:
boolean isNegative = number > 0 ? false : true;
本质上与 if else 是“等价的”
if(number > 0)
isNegative = false;
else
isNegative = true;
除了不同海报给出的例子,
您也可以使用 : 来表示一个块的标签,您可以将其与 continue 和 break 结合使用..
例如:
public void someFunction()
//an infinite loop
goBackHere: //label
for(int i = 0; i < 10 ;i++)
if(i == 9 ) continue goBackHere;
【讨论】:
对不起,这是一个糟糕的例子。你为什么不写 boolean isNegative = number > 0;三元条件适用于诸如 double sgn = number>0 之类的事情? 1:0; @user44242 哈哈,是的,我什至不记得我为什么举这个例子了。 @user44242 显示这样的示例使其更简单,更好地显示条件运算符的工作原理。 "你为什么不写 boolean isNegative = number > 0;" 因为这并不能说明三元运算符的任何内容。【参考方案8】:在您的具体情况下,
String cardString = "";
for (PlayingCard c : this.list) // <--
cardString = cardString + c + "\n";
this.list
是一个集合(列表、集合或数组),该代码将 c
分配给集合的每个元素。
所以,如果 this.list
是一个集合 "2S", "3H", "4S",那么末尾的 cardString
就是这个字符串:
2S
3H
4S
【讨论】:
感谢您的回答。这段代码怎么能重写不使用“:”?【参考方案9】:冒号实际上与?
一起存在
int minVal = (a < b) ? a : b;
相当于:
int minval;
if(a < b) minval = a;
else minval = b;
同样在 for each 循环中:
for(Node n : List l) ...
字面意思:
for(Node n = l.head; n.next != null; n = n.next)
【讨论】:
【参考方案10】:在 for 循环中用于遍历对象列表。
for (Object o: list)
// o is an element of list here
把它想象成 Python 中的 for <item> in <list>
。
【讨论】:
【参考方案11】:没有“冒号”运算符,但冒号出现在两个地方:
1:在三元运算符中,例如:
int x = bigInt ? 10000 : 50;
在这种情况下,三元运算符充当表达式的“if”。如果 bigInt 为真,则 x 将获得 10000 分配给它。如果不是,50。这里的冒号表示“else”。
2:在 for-each 循环中:
double[] vals = new double[100];
//fill x with values
for (double x : vals)
//do something with x
这会将 x 依次设置为 'vals' 中的每个值。因此,如果 vals 包含 [10, 20.3, 30, ...],则 x 在第一次迭代时为 10,在第二次迭代时为 20.3,以此类推。
注意:我说它不是运算符,因为它只是语法。它不能单独出现在任何给定的表达式中,而且 for-each 和三元运算符都使用冒号只是偶然。
【讨论】:
下半年有帮助,这应该是真正的答案 +1 可以更详细地解释它在 for-each 循环中的作用。【参考方案12】:用于新的简写for/loop
final List<String> list = new ArrayList<String>();
for (final String s : list)
System.out.println(s);
三元运算符
list.isEmpty() ? true : false;
【讨论】:
我没有意识到它是新的......它是什么时候出现的? @Mechko,在 Java 5 中:java.sun.com/j2se/1.5.0/docs/relnotes/features.html#forloop 哦……那是 6 年前的事了……在我的参考框架中并不新鲜 :D 我和小猪在一起 - 六年意味着它几乎从一开始就存在。以上是关于冒号 (:) 运算符有啥作用?的主要内容,如果未能解决你的问题,请参考以下文章