Pregunta Java: ¿Qué hace el operador de dos puntos (:)?


Lo buscaría yo mismo, pero ni siquiera sé cómo se llama. ¿Alguien le importaría explicar lo que hace?

No sabía que había muchas veces el: apareció. ¿Qué hace en este caso aquí?

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

¿Cómo escribirías esto? for-each bucle de una manera diferente para no incorporar el ":"?


73
2018-03-08 06:09


origen


Respuestas:


Hay varios lugares donde se usa colon en el código de Java:

1) Etiqueta de salto (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) Condición ternaria (Tutorial)

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

3) Para cada bucle (Tutorial)

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

4) Afirmación (Guía)

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) Caso en declaración de interruptor (Tutorial)

switch (type) {
    case WHITESPACE:
    case RETURN:
        break;
    case NUMBER:
        print("got number: " + value);
        break;
    default:
        print("syntax error");
}

6) referencias de métodos (Tutorial)

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

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

164
2018-03-08 06:16



No hay un operador de "dos puntos", pero el dos puntos aparece en dos lugares:

1: en el operador ternario, por ejemplo:

int x = bigInt ? 10000 : 50;

En este caso, el operador ternario actúa como un 'si' para las expresiones. Si bigInt es verdadero, entonces x tendrá 10000 asignados a él. Si no, 50. Los dos puntos aquí significan "else".

2: en un bucle for-each:

double[] vals = new double[100];
//fill x with values
for (double x : vals) {
    //do something with x
}

Esto establece x a cada uno de los valores en 'vals' a su vez. Entonces, si vals contiene [10, 20.3, 30, ...], entonces x será 10 en la primera iteración, 20.3 en la segunda, etc.

Nota: digo que no es un operador porque es solo sintaxis. No puede aparecer en una expresión dada por sí mismo, y es solo una casualidad que tanto el operador for-each como el operador ternario usen dos puntos.


33
2018-03-08 06:12



Solo para agregar, cuando se usa en un bucle for-each, el ":" puede leerse básicamente como "in".

Asi que

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

debe leerse "Para cada nombre EN nombres ..."


17
2018-03-08 08:28



¿Cómo escribirías esto para cada bucle de una manera diferente para no incorporar el ":"?

Asumiendo que list es un Collection instancia ...

public String toString() {
   String cardString = "";
   for (Iterator<PlayingCard> it = this.list.iterator(); it.hasNext(); /**/) {
      PlayingCard c = it.next();
      cardString = cardString + c + "\n";
   }
}

Debo agregar el punto pedante que : no es un operador en este contexto. Un operador realiza una operación en una expresión, y las cosas dentro de la ( ... ) en un for declaración no es una expresión ... de acuerdo con el JLS.


14
2018-03-08 07:27



Se usa en ciclos for para iterar sobre una lista de objetos.

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

Piense en ello como un for <item> in <list> en Python.


1
2018-03-08 06:12



En tu caso específico,

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

this.list es una colección (lista, conjunto o matriz) y ese código asigna c a cada elemento de la colección.

Así que si this.list eran una colección {"2S", "3H", "4S"} luego el cardString al final sería esta cadena:

2S
3H
4S

1
2018-03-08 06:24



Usualmente lo ves en el operador de asignación ternaria;

Sintaxis

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

ejemplo:

boolean isNegative = number > 0 ? false : true;

que es de naturaleza "equivalente" al if else

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

Aparte de ejemplos dados por diferentes carteles,

también puede usar: para indicar una etiqueta para un bloque que puede usar junto con continuar y romper ...

por ejemplo:

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

1
2018-03-08 06:18



Imprimirá la cadena "algo" tres veces.

JLabel[] labels = {new JLabel(), new JLabel(), new JLabel()};                   

for ( JLabel label : labels )                  
 {              
   label.setText("something");  

 panel.add(label);             
 }

1
2017-07-25 09:30