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

91

Aparentemente, los dos puntos se utilizan de varias formas en Java. ¿A alguien le importaría explicar lo que hace?

Por ejemplo aquí:

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

¿Cómo escribirías este for-eachbucle de una manera diferente para no incorporar el :?

limón
fuente
4
Otros ya han mencionado que tal caso es un ciclo para cada uno. Para obtener una explicación más detallada de cómo funciona, consulte java.sun.com/j2se/1.5.0/docs/guide/language/foreach.html
Jonik

Respuestas:

195

Hay varios lugares donde se usan los dos puntos en el código Java:

1) Etiqueta de salida ( 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 la declaración de cambio ( 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);
Randy Sugianto 'Yuku'
fuente
3
agradable - ¡me perdí algunos! y ni siquiera sabía que se pueden nombrar afirmaciones así, muy útiles.
Claudiu
Viniendo de .NET (C #), la analogía más cercana para la estructura en cuestión sería for-each, que explicó de buena manera.
Roger
2
Un error assertno "sale del programa". Lanza un AssertionError. Solo hará que el programa se cierre si se lanza a la pila del único subproceso que no es demonio restante ... y no se detecta.
Stephen C
si su objetivo es incluir todo, entonces agregaría dos puntos dobles (: :) operador
kiedysktos
1
Además, se utilizan dos puntos dobles en las referencias de métodos.
Daniel M.
34

No hay un operador de "dos puntos", pero los dos puntos aparecen 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 se le asignará 10000. Si no, 50. Los dos puntos aquí significan "más".

2: en un bucle para cada uno:

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

Esto establece xa 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 ninguna expresión dada por sí solo, y es solo una casualidad que tanto el operador for-each como el ternario usen dos puntos.

Claudiu
fuente
La segunda mitad ayudó, esta debería ser la respuesta real
erp
+1 para obtener una explicación más detallada de lo que está haciendo en cada ciclo.
dfarrell07
18

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

Entonces

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

debe leerse "Para cada nombre IN nombres hacer ..."

método de ayuda
fuente
15

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

Suponiendo que listsea ​​una Collectioninstancia ...

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 de que :no es un operador en este contexto. Un operador realiza una operación en una expresión, y lo que está dentro ( ... )de una fordeclaración no es una expresión ... de acuerdo con JLS.

Esteban C
fuente
Mi pregunta es: ¿por qué? ¿Por qué hacer lo mismo del largo camino?
RichN
2
@RichN: no quiere hacerlo, solo quiere saber cómo.
Stephen C
3
no deberes, quiero saber cómo hacerlo de la manera más larga para poder entender la lógica
lemon
De hecho, en mi (mala) universidad, durante los estudios de ingeniería informática, nunca nos enseñaron nada sobre el (:) en el curso de java, lo aprendí más tarde viendo ejemplos y, lamentablemente, ahora me cuesta codificarlo. en mi mente desde que hice todos los proyectos en la uni el camino largo
Carlos Sanchez
No es necesario asumir que listes una instancia de Collection; debe ser una instancia de Iterablesi se puede usar en el bucle for mejorado, lo que significa que tendrá el iterator()método al que llama en su respuesta.
Kröw
1

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

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

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

Mike Cialowicz
fuente
1

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.

Entonces, si this.listfuera una colección {"2S", "3H", "4S"}, cardStringal final sería esta cadena:

2S
3H
4S
Randy Sugianto 'Yuku'
fuente
1
gracias por tu respuesta. ¿Cómo podría reescribirse este código para no usar el ":"?
limón
1

Normalmente lo ve en el operador de asignación ternario;

Sintaxis

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

ejemplo:

boolean isNegative = number > 0 ? false : true;

que es "equivalente" en naturaleza al if else

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

Aparte de los 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;
          }
     }
}
ultrajohn
fuente
2
Lo siento, pero ese es un ejemplo terrible. ¿Por qué no escribirías boolean isNegative = number> 0; Las condiciones ternarias son buenas para cosas como double sgn = number> 0? 1: 0;
user44242
@ user44242 lol sí, ni siquiera recuerdo por qué di ese ejemplo.
ultrajohn
1
@ user44242 Mostrar un ejemplo como ese lo hace simple y muestra mejor cómo funciona el operador condicional. " ¿Por qué no escribirías booleano isNegative = número> 0? " Porque eso no demuestra nada sobre el operador ternario.
Kröw
1

Imprimirá la cadena "algo" tres veces.

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

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

 panel.add(label);             
 }
Saurav Sahu
fuente
1
esto es lo que se dijo anteriormente como bucle
ForEach
1

Dado que la mayoría de los bucles for son muy similares, Java proporciona un atajo para reducir la cantidad de código necesario para escribir el bucle denominado for cada bucle.

Aquí hay un ejemplo de lo conciso para cada ciclo:

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

En el ejemplo anterior, los dos puntos (:) se pueden leer como "en". El para cada ciclo en conjunto se puede leer como "para cada elemento entero (llamado grado) en quizGrades, imprima el valor de grado".

Desarrollador suave
fuente
0

Se utiliza en la nueva mano corta para / loop

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

y el operador ternario

list.isEmpty() ? true : false;

fuente
No me di cuenta de que era tan nuevo ... ¿cuándo llegó?
Ritwik Bose
3
oh ... eso fue hace 6 años ... No es nuevo según mi marco de referencia: D
Ritwik Bose
2
Estoy con cerditos: seis años significa que ha existido desde prácticamente los albores de los tiempos.
James Moore
0

El colon existe en realidad junto con ?

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

es equivalente a:

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

También en el para cada bucle:

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

literalmente:

for(Node n = l.head; n.next != null; n = n.next)
Ritwik Bose
fuente
0

dos puntos están usando para cada ciclo, pruebe este ejemplo,

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);
                   }
       }
}
Saurabh Srivastava
fuente