Что делает оператор двоеточия (:)?

По-видимому, двоеточие используется в Java несколькими способами. Кто-нибудь объяснит, что он делает?

Например здесь:

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

Как бы вы написали этот цикл for-each по-другому, чтобы не включать :?


person dukevin    schedule 08.03.2010    source источник
comment
Другие уже упоминали, что такой случай является циклом for-each. Более подробное объяснение того, как это работает, см. в разделе java. .sun.com/j2se/1.5.0/docs/guide/language/foreach.html   -  person Jonik    schedule 08.03.2010


Ответы (12)


Есть несколько мест, где двоеточие используется в коде 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) Цикл For-each (Учебник):

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 (Учебник):

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);
person Randy Sugianto 'Yuku'    schedule 08.03.2010
comment
хорошо - я пропустил несколько! и я даже не знал, что вы можете называть такие утверждения, очень полезные. - person Claudiu; 08.03.2010
comment
Исходя из .NET (C #), ближайшей аналогией рассматриваемой структуры будет for-each, которую вы хорошо объяснили. - person Roger; 06.09.2012
comment
Ошибка assert не приводит к выходу из программы. Он выдает AssertionError. Это приведет к выходу программы только в том случае, если она будет брошена в стек единственного оставшегося потока, не являющегося демоном ... и не будет перехвачена. - person Stephen C; 13.06.2014
comment
если вы хотите включить все, я бы добавил оператор с двойным двоеточием (::) - person kiedysktos; 23.06.2015
comment
Кроме того, в ссылках на методы используется двойное двоеточие. - person Daniel M.; 14.04.2016
comment
Что насчет этого сегмента кода? + equals(object2:Stock) : boolean - person Aaron Franke; 23.10.2017
comment
Первый пример — всплывающая метка — кажется, содержит точку с запятой, а не двоеточие. - person Ben Creasy; 01.07.2018

Оператор двоеточия отсутствует, но двоеточие появляется в двух местах:

1: В тернарном операторе, например:

int x = bigInt ? 10000 : 50;

В этом случае тернарный оператор действует как «если» для выражений. Если bigInt истинно, то x получит 10000 присвоенных ему значений. Если нет, то 50. Двоеточие здесь означает «еще».

2: В цикле для каждого:

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, и тернарный оператор используют двоеточие.

person Claudiu    schedule 08.03.2010
comment
вторая половина помогла, это должен быть настоящий ответ - person erp; 14.08.2014
comment
+1 за более подробное объяснение того, что он делает в цикле for-each. - person dfarrell07; 15.09.2014

Просто добавим, что при использовании в цикле for-each ":" в основном можно прочитать как "in".

So

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

следует читать "Для каждого имени В названиях делать..."

person helpermethod    schedule 08.03.2010

Как бы вы написали этот цикл 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.

person Stephen C    schedule 08.03.2010
comment
Мой вопрос: почему? Зачем делать то же самое на длинном пути? - person RichN; 08.03.2010
comment
@RichN - он не хочет этого делать, он просто хочет знать, как это сделать. - person Stephen C; 08.03.2010
comment
не домашнее задание, я хочу знать, как это сделать, чтобы я мог понять логику - person dukevin; 10.02.2011
comment
На самом деле в моем (плохом) университете, во время учебы в области компьютерной инженерии, нас никогда ничего не учили о (:) в курсе java, я научился этому позже, просмотрев примеры, и, к сожалению, мне сейчас трудно его кодировать на мой взгляд, так как я сделал все проекты в универе долгий путь - person Carlos Sanchez; 21.03.2015
comment
Вам не нужно предполагать, что list является экземпляром Collection; это должен быть экземпляр Iterable, если его можно использовать в расширенном цикле for, что означает, что он будет иметь метод iterator(), который вы вызываете в своем ответе. - person Kröw; 24.05.2019
comment
Достаточно справедливо, но в контексте вопроса маловероятно, что это будет какой-то пользовательский/сторонний класс, который не расширяет Collection. (Более вероятно, что это будет массив... где это не сработает!) - person Stephen C; 25.05.2019

Он используется в циклах for для перебора списка объектов.

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

Думайте об этом как о for <item> in <list> в Python.

person Mike Cialowicz    schedule 08.03.2010

В вашем конкретном случае,

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

this.list — это коллекция (список, набор или массив), и этот код присваивает c каждому элементу коллекции.

Итак, если бы this.list было коллекцией {"2S", "3H", "4S"}, то cardString в конце было бы такой строкой:

2S
3H
4S
person Randy Sugianto 'Yuku'    schedule 08.03.2010
comment
спасибо за Ваш ответ. Как можно переписать этот код, чтобы не использовать : ? - person dukevin; 08.03.2010

Обычно вы видите это в тернарном операторе присваивания;

Синтаксис

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;
          }
     }
}
person ultrajohn    schedule 08.03.2010
comment
Извините, но это ужасный пример. Почему бы вам не написать boolean isNegative = number › 0; Тернарные условия хороши для таких вещей, как double sgn = number›0 ? 1:0; - person user44242; 08.03.2010
comment
@user44242 user44242 лол, да я даже не помню, почему я привел этот пример. - person ultrajohn; 31.12.2015
comment
@ user44242 Показ такого примера делает его простым и лучше показывает, как работает условный оператор. Почему бы вам не написать boolean isNegative = number › 0; Потому что это ничего не демонстрирует о тернарном операторе. - person Kröw; 24.05.2019

Он используется в новой короткой руке for/loop

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

и тернарный оператор

list.isEmpty() ? true : false;
person Community    schedule 08.03.2010
comment
Я не знал, что он такой новый... когда он появился? - person Ritwik Bose; 08.03.2010
comment
@Mechko, в Java 5: java.sun.com /j2se/1.5.0/docs/relnotes/features.html#forloop - person Jonik; 08.03.2010
comment
о... это было 6 лет назад... Не ново для меня :D - person Ritwik Bose; 08.03.2010
comment
Я с поросятами - шесть лет означает, что это было практически с незапамятных времен. - person James Moore; 23.09.2010

Двоеточие на самом деле существует в сочетании с ?

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)
person Ritwik Bose    schedule 08.03.2010

Он напечатает строку «что-то» три раза.

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

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

 panel.add(label);             
 }
person Community    schedule 25.07.2014
comment
это то, что сказано выше как цикл ForEach - person P.JAYASRI; 20.03.2015

Поскольку большинство циклов for очень похожи, в Java предусмотрен способ сократить объем кода, необходимого для написания цикла, который называется циклом for each.

Вот пример краткого для каждого цикла:

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

В приведенном выше примере двоеточие (:) может быть прочитано как «in». Цикл for each в целом можно прочитать как «для каждого целочисленного элемента (называемого оценкой) в quizGrades распечатать значение оценки».

person Soft developer    schedule 26.07.2017

двоеточие используется в цикле 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);
                   }
       }
}
person Community    schedule 08.10.2016