Что такое Java ?:вызван оператор, и что он делает?
-
18-09-2019 - |
Вопрос
Я работаю с Java пару лет, но до недавнего времени я не сталкивался с этой конструкцией:
int count = isHere ? getHereCount(index) : getAwayCount(index);
Вероятно, это очень простой вопрос, но кто-нибудь может это объяснить?Как мне это прочесть?Я почти уверен, что знаю, как это работает.
- если
isHere
это правда,getHereCount()
называется, - если
isHere
является ложнымgetAwayCount()
называется.
Правильно?Как называется эта конструкция?
Решение
Да, это сокращенная форма
int count;
if (isHere)
count = getHereCount(index);
else
count = getAwayCount(index);
Это называется условный оператор.Многие люди (ошибочно) называют это троичный оператор, потому что это единственный тернарный оператор (с тремя аргументами) в Java, C, C ++ и, вероятно, многих других языках.Но теоретически существует мог бы быть другим троичным оператором, тогда как может быть только один условный оператор.
Официальное название приведено в Спецификация языка Java:
§15.25 Условный оператор ?:
Условный оператор
? :
использует логическое значение одного выражения, чтобы решить, какое из двух других выражений следует вычислить.
Обратите внимание, что обе ветви должны приводить к методам с возвращаемыми значениями:
Это ошибка времени компиляции, поскольку либо второе, либо третье выражение операнда является вызовом метода void.
Фактически, с помощью грамматики выражений statements (§14.8), не допускается появление условного выражения в любом контексте, где может появиться вызов метода void.
Итак, если doSomething()
и doSomethingElse()
являются методами void, вы не можете сжать это:
if (someBool)
doSomething();
else
doSomethingElse();
в это:
someBool ? doSomething() : doSomethingElse();
Простые слова:
booleanCondition ? executeThisPartIfBooleanConditionIsTrue : executeThisPartIfBooleanConditionIsFalse
Другие советы
Другие отвечали на этот вопрос в разумных пределах, но часто с названием "троичный оператор".
Будучи педантом, каким я являюсь, я хотел бы прояснить, что имя оператора - это условный оператор или "условный оператор ?:".Это a троичный оператор (в том смысле, что он имеет три операнда), и это единственный троичный оператор в Java на данный момент.
Однако, в спецификация довольно ясна чтобы его название было абсолютно недвусмысленным, это условный оператор или "conditional operator ?:".Я думаю, что понятнее называть его этим именем, поскольку оно в некоторой степени указывает на поведение оператора (оценивающего условие), а не просто на то, сколько у него операндов.
В соответствии с Спецификация Sun Java, это называется Условным оператором.См. раздел 15.25.Вы правы относительно того, что это делает.
Условный оператор ?:использует логическое значение одного выражения, чтобы решить, какое из двух других выражений следует вычислить.
Условный оператор синтаксически ассоциативен с правом (он группирует справа налево), так что a?b:c?d: e?f: g означает то же самое, что и a?b:(c?d:(e?f:g)).
ConditionalExpression:
ConditionalOrExpression
ConditionalOrExpression ? Expression : ConditionalExpression
Условный оператор имеет три выражения - операнда;?появляется между первым и вторым выражениями, и :появляется между вторым и третьим выражениями.
Первое выражение должно иметь тип boolean или Boolean , в противном случае возникает ошибка времени компиляции.
Не совсем корректно, если быть точным:
- если IShere истинно, то Результат из gether count() является возвращенный
- в противном случае Результат из getAwayCount() является возвращенный
Это "вернулось" очень важно.Это означает методы должен возвращает значение и это значение должен быть назначенным куда-нибудь.
Кроме того, это не совсем синтаксически эквивалентно версии if-else.Например:
String str1,str2,str3,str4;
boolean check;
//...
return str1 + (check ? str2 : str3) + str4;
Если кодируется с помощью if-else, это всегда приведет к большему количеству байт-кода.
int count = isHere ? getHereCount(index) : getAwayCount(index);
означает :
if (isHere) {
count = getHereCount(index);
} else {
count = getAwayCount(index);
}
condition ? truth : false;
Если условие является true
затем верните первый параметр.Если условие является false
, возвращает второй параметр.
Это называется Условный оператор и это один из видов Троичная операция.
Троичный, условный;помидор, помидорох.Для чего это действительно ценно, так это для инициализации переменных.Если (как и я) вам нравится инициализировать переменные там, где они определены, условный тернарный оператор (поскольку это и то, и другое) позволяет вам делать это в случаях, когда существует условность относительно его значения.Особенно заметен в конечных полях, но полезен и в других местах.
например ,:
public class Foo {
final double value;
public Foo(boolean positive, double value) {
this.value = positive ? value : -value;
}
}
Без этого оператора - под любым именем - вам пришлось бы сделать поле не окончательным или написать функцию просто для его инициализации. На самом деле, это неправильно - он все еще может быть инициализирован с помощью if /else, по крайней мере, в Java.Но я нахожу это более чистым.
Эта конструкция называется Троичный Оператор в области компьютерных наук и техники программирования.
И Википедия предложите следующее объяснение:
В информатике троичный оператор (иногда неправильно называемый третичным оператором) - это оператор, который принимает три аргумента.Аргументы и результат могут быть разных типов.Многие языки программирования, использующие C-подобный синтаксис, содержат троичный оператор, ?:, который определяет условное выражение.
Этот синтаксис доступен не только в Java, но и в PHP, Objective-C.
В следующем Ссылка в нем дается следующее объяснение, которое очень полезно для его понимания:
Троичный оператор - это некоторая операция, работающая на 3 входах.Это сокращение для оператора if-else, также известное как условный оператор.
В Perl / PHP это работает как:
boolean_condition ? true_value : false_value
В C / C ++ это работает как:
logical expression ? action for true : action for false
Это может быть доступно для чтения для некоторых логических условий, которые не являются слишком сложными, в противном случае лучше использовать Блок If-Else с предполагаемой комбинацией условной логики.
Мы можем упростить Блоки If-Else с помощью этого троичного оператора для одной строки инструкции кода.
Например:
if ( car.isStarted() ) {
car.goForward();
} else {
car.startTheEngine();
}
Может быть равно следующему:
( car.isStarted() ) ? car.goForward() : car.startTheEngine();
Итак, если мы обратимся к вашему заявлению:
int count = isHere ? getHereCount(index) : getAwayCount(index);
На самом деле это 100% эквивалент следующего Блок If-Else:
int count;
if (isHere) {
count = getHereCount(index);
} else {
count = getAwayCount(index);
}
Вот и все!
Надеюсь, это было кому-то полезно!
Ваше здоровье!
Правильно.Это вызванный в троичный оператор.Некоторые также называют это условный оператор.
Его троичный оператор(?:)
The ternary operator is an operator that takes three arguments. The first
argument is a comparison argument, the second is the result upon a true
comparison, and the third is the result upon a false comparison.
Возможно, вас заинтересует предложение для некоторых новых операторов, которые похожи на условный оператор.Операторы, защищенные от нуля, включат код, подобный этому:
String s = mayBeNull?.toString() ?: "null";
Это было бы особенно удобно там, где происходит автоматическая распаковка коробки.
Integer ival = ...; // may be null
int i = ival ?: -1; // no NPE from unboxing
Это было отобран для дальнейшего рассмотрения в разделе JDK 7 "Project Coin".
На самом деле это может занять более 3 аргументов.Например, если мы хотим проверить, является ли число положительным, отрицательным или нулевым, мы можем сделать это:
String m= num > 0 ? "is a POSITIVE NUMBER.": num < 0 ?"is a NEGATIVE NUMBER." :"IT's ZERO.";
это лучше, чем использовать if, else if, else.
Это условный оператор, и это больше, чем просто краткий способ написания операторов if.
Поскольку это выражение, которое возвращает значение, оно может использоваться как часть других выражений.
Да, вы правы.?:обычно называется "троичный условный оператор", часто именуемый просто "троичный оператор".Это сокращенная версия стандартного условия if /else.
Так получилось, что мне действительно нравится этот оператор, но следует принимать во внимание читателя.
Вам всегда приходится балансировать между компактностью кода и временем, затраченным на его чтение, и в этом у него есть некоторые довольно серьезные недостатки.
Прежде всего, есть дело Оригинального Аскера.Он только что потратил час на публикацию сообщений об этом и чтение ответов.Сколько времени потребовалось бы автору , чтобы написать каждый ?:как "если"/"тогда" на протяжении всей его жизни.Не прошло и часа, чтобы быть уверенным.
Во-вторых, в C-подобных языках у вас входит в привычку просто знать, что условные выражения - это первое, что есть в строке.Я заметил это, когда использовал Ruby и наткнулся на такие строки, как:
callMethodWhatever(Long + Expression + with + syntax) if conditional
Если бы я был давним пользователем Ruby, у меня, вероятно, не возникло бы проблем с этой строкой, но, исходя из C, когда вы видите "callMethod Whatever" первым в строке, вы ожидаете, что оно будет выполнено.Тот самый ?:менее загадочен, но все же достаточно необычен, чтобы сбить читателя с толку.
Преимущество, однако, заключается в действительно приятном ощущении в животе, когда вы можете написать 3-строчный оператор if через 1 строку.Не могу этого отрицать :) Но, честно говоря, не обязательно более читаемый 90% людей просто из-за его "редкости".
Когда это действительно присваивание, основанное на логическом значении и значениях, у меня с этим не возникает проблем, но им можно легко злоупотребить.
Условные выражения выполнены в совершенно другом стиле, без явного if в операторе.
Синтаксис таков:логическое выражение ?выражение 1 :выражение 2;
Результатом этого условного выражения является
выражение1, если логическое выражение равно true;
в противном случае результатом будет expression2.
Предположим, вы хотите присвоить большему числу переменных num1 и num2 значение max.Вы можете просто написать оператор, используя условное выражение:макс = (num1 > num2) ?число 1 :число 2;
Примечание:Символы ?и :появляются вместе в условном выражении.Они образуют условный оператор и также называются троичным оператором, потому что он использует три операнда.Это единственный троичный оператор в Java.
цитируется из:Введение в программирование на Java 10-е издание Y.Дэниел Лян страница 126 - 127