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 “:”?

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 } } // ie 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) For-each loop ( 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 statement 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); 

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 syntax. 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.

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 …”

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

Suponiendo que esa list es una instancia de Collection

 public String toString() { String cardString = ""; for (Iterator 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 el material dentro de ( ... ) en una statement for no es una expresión … según el JLS.

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

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

Piénselo como un for in en Python.

En tu caso específico,

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

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

Entonces, si this.list fuera una colección {"2S", "3H", "4S"} entonces la cardString en el extremo sería esta cadena:

 2S 3H 4S 

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; } } } 

Imprimirá la cadena “algo” tres veces.

 JLabel[] labels = {new JLabel(), new JLabel(), new JLabel()}; for ( JLabel label : labels ) { label.setText("something"); panel.add(label); } 

Como la mayoría de los bucles for son muy similares, Java proporciona un atajo para reducir la cantidad de código requerido para escribir el bucle llamado para 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 se puede leer como “para cada elemento entero (llamado grado) en cuestionarios, imprima el valor de grado”.

Se usa en la nueva mano corta para / loop

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

y el operador ternario

 list.isEmpty() ? true : false; 

¿El colon realmente existe 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 ciclo:

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

literalmente:

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

dos puntos está utilizando en cada bucle, 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); } } } 
    Intereting Posts