冒号(:)运算符做什么?


89

显然,Java中冒号以多种方式使用。有人介意解释它的作用吗?

例如这里:

String cardString = "";
for (PlayingCard c : this.list)  // <--
{
    cardString += c + "\n";
}

您将如何for-each以不同的方式编写此循环,以便不合并:


4
其他人已经提到这种情况是一个for-each循环。有关其工作原理的更详细说明,请参见java.sun.com/j2se/1.5.0/docs/guide/language/foreach.html
Jonik,2010年

Answers:


193

在Java代码中冒号有几个地方:

1)弹出标签(教程):

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)三元条件(教程):

int a = (b < 4)? 7: 8; // if b < 4, set a to 7, else set a to 8

3)每个循环(教程):

String[] ss = {"hi", "there"}
for (String s: ss) {
    print(s); // output "hi" , and "there" on the next iteration
}

4)断言(指南):

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 (type) {
    case WHITESPACE:
    case RETURN:
        break;
    case NUMBER:
        print("got number: " + value);
        break;
    default:
        print("syntax error");
}

6)方法参考(教程

class Person {
   public static int compareByAge(Person a, Person b) {
       return a.birthday.compareTo(b.birthday);
   }}
}

Arrays.sort(persons, Person::compareByAge);

3
很好-我错过了一些!我什至不知道您可以这样命名断言,这非常有用。
克劳迪(Claudiu)2010年

来自.NET(C#),与上述结构最接近的类比是for-each,您已很好地说明了这一点。
罗杰

2
失败assert不会“退出程序”。它抛出一个AssertionError。仅当程序被扔到仅剩余的非守护程序线程的堆栈上而没有被捕获时,它才会导致程序退出。
Stephen C

如果您打算包含所有内容,那么我将添加双冒号(::)运算符
kiedysktos 2015年

1
同样,在方法引用中使用双冒号。
丹尼尔·M

34

没有“冒号”运算符,但冒号出现在两个位置:

1:在三元运算符中,例如:

int x = bigInt ? 10000 : 50;

在这种情况下,三元运算符充当表达式的“ if”。如果bigInt为true,则x将分配给它10000。如果不是,则为50。冒号在这里表示“其他”。

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和三元运算符都可能使用冒号。


下半场有所帮助,这应该是真正的答案
erp

+1可更详细地解释它在for-each循环中的功能。
dfarrell07 2014年

18

只需添加一下,当在for-each循环中使用时,“:”基本上可以读作“ in”。

所以

for (String name : names) {
    // remainder omitted
}

应该读为“对于每个名称,IN名称都应...”


15

您将如何以不同的方式编写此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";
   }
}

:在这种情况下,我应该添加不是运算符的pedantic点。操作员在一个表达式执行操作,并且里面的东西( ... )for语句不是一种表达......根据JLS。


我的问题是:为什么?为什么要长期做同样的事情?
RichN

2
@RichN-他不想这样做,他只是想知道如何做。
斯蒂芬·C

3
不是功课,我想知道如何长远地做它,这样我才能理解逻辑
柠檬

实际上,在我(不好的)大学里,在计算机工程学习期间,他们从来没有在Java课程中教我们任何有关(:)的知识,后来我通过观看示例来学习它,不幸的是,现在对我来说很难编码自从我完成了大学的所有项目以来,我就一直记在脑海里
Carlos Sanchez

您无需假设这list是的实例Collection;它必须是Iterable是否可以在增强的for循环中使用的实例,这意味着它将具有iterator()您在答案中调用的方法。
克鲁夫

1

它在for循环中用于迭代对象列表。

for (Object o: list)
{
    // o is an element of list here
}

将其视为for <item> in <list>Python中的一个。


1

根据您的具体情况,

String cardString = "";
for (PlayingCard c : this.list)  // <--
{
    cardString = cardString + c + "\n";
}

this.list是一个集合(列表,集合或数组),并且该代码将分配c给集合的每个元素。

因此,如果this.list有一个集合{“ 2S”,“ 3H”,“ 4S”},那么cardString结尾将是以下字符串:

2S
3H
4S

1
感谢您的回答。如何将这些代码重写为不使用“:”?
柠檬

1

您通常会在三元赋值运算符中看到它;

句法

variable =  `condition ? result 1 : result 2;`

例:

boolean isNegative = number > 0 ? false : true;

在本质上与“其他”等效

if(number > 0){
    isNegative = false;
}
else{
    isNegative = true;
}

除了不同海报的例子,

您还可以使用:表示一个块的标签,可以将其与c​​ontinue和break结合使用。

例如:

public void someFunction(){
     //an infinite loop
     goBackHere: { //label
          for(int i = 0; i < 10 ;i++){
               if(i == 9 ) continue goBackHere;
          }
     }
}

2
抱歉,这是一个糟糕的例子。为什么不写boolean isNegative = number> 0; 三元条件对诸如double sgn = number> 0?1:0;
user44242'3

@ user44242大声笑是的,我什至不记得为什么我举这个例子。
ultrajohn

1
@ user44242显示这样的示例可以使其更简单并更好地显示条件运算符的工作方式。“为什么不编写boolean isNegative = number> 0; “因为这并没有说明有关三元运算符的任何信息。
克鲁夫


1

由于大多数for循环非常相似,因此Java提供了一种捷径来减少编写称为for循环的循环所需的代码量。

这是每个循环的简洁示例:

for (Integer grade : quizGrades){
      System.out.println(grade);
 }    

在上面的示例中,冒号(:)可以读为“ in”。每个循环的总和可以理解为“对于quizGrades中的每个Integer元素(称为等级),输出等级的值”。


0

用于新的简写形式for / loop

final List<String> list = new ArrayList<String>();
for (final String s : list)
{
   System.out.println(s);
}

和三元运算符

list.isEmpty() ? true : false;

我没意识到那是新的……什么时候来的?
Ritwik Bose


3
哦...那是6年前...按照我的参考框架并不是什么新鲜事物:D
Ritwik Bose 2010年

2
我很喜欢-六年意味着它已经存在了,几乎是时间的曙光。
詹姆斯·摩尔

0

冒号实际上与 ?

int minVal = (a < b) ? a : b;

等效于:

int minval;
if(a < b){ minval = a;} 
else{ minval = b; }

同样在for每个循环中:

for(Node n : List l){ ... }

从字面上看:

for(Node n = l.head; n.next != null; n = n.next)

0

在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);
                   }
       }
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.