Как вы думаете, какие целые числа соответствуют trueи falseсоответственно?
Турбьерн Равн Андерсен
4
Некоторые языки имеют неявное преобразование из int в логическое значение. Ява не Однако в официальной реализации есть пакеты SQL, и я считаю, что они конвертируют «false» в 0.
hpique
4
@Peter Lawrey Нет, если вы хотите взаимодействовать с другими системами, для которых логический тип не является числовым типом.
hpique
6
@Peter Lawrey Вопрос на самом деле не в отображении стоимости. Речь идет о том, как сделать преобразование наиболее понятным и приемлемым способом.
hpique
7
Технически, компилятор Java уже определяет отображение. True и False компилируются в 1 и 0 соответственно.
Использование троичного оператора - это самый простой, эффективный и самый читаемый способ сделать то, что вы хотите. Я призываю вас использовать это решение.
Однако я не могу удержаться, чтобы предложить альтернативное, надуманное, неэффективное, нечитаемое решение.
int boolToInt(Boolean b){return b.compareTo(false);}
Эй, людям нравится голосовать за такие крутые ответы!
редактировать
Между прочим, я часто видел преобразования из логического значения в int с единственной целью - сделать сравнение двух значений (как правило, в реализациях compareToметода).Boolean#compareToэто путь в этих конкретных случаях.
Редактировать 2
Java 7 представила новую служебную функцию, которая работает непосредственно с примитивными типами Boolean#compare(спасибо, shmosel )
int boolToInt(boolean b){returnBoolean.compare(b,false);}
Будут выделены современными JIT, поэтому не обязательно неэффективными. Также он документирует, почему b.compareTo используется, чтобы его можно было прочитать.
Торбьерн Равн Андерсен
2
Это может быть медленно, потому что нам нужно поместить значение примитива в объект. Метод троичных операторов работает напрямую с примитивными значениями без преобразования, поэтому я думаю, что он более эффективен.
Барджак
5
1. Вы можете использовать Boolean.compare()и избежать автобокс. 2. В документации Boolean.compareTo()не говорится, что она вернет 1, только «положительное значение, если этот объект представляет истину, а аргумент представляет ложь».
шмосел
1
Я только что проверил преобразование 1 000 000 случайных логических значений, и этот метод был последовательно быстрее, чем метод, основанный на троичном операторе. Он сбрил около 10 мс.
Mapsy
3
@AlexT. если вы делаете микробенчмарки, вы должны использовать структуру, чтобы гарантировать, что вы измеряете правильно. См. Openjdk.java.net/projects/code-tools/jmh .
Я думаю, что это было бы лучше подходит как комментарий, а не как ответ.
hpique 25.09.10
164
5 - b.toString().length
Кеннитм
5
@ ThorbjørnRavnAndersen Да. Использование одного из других, более эффективных, опубликованных методов, которые не требуют таких накладных расходов. Если вы не можете объяснить, как создание строковых объектов для простой проверки значения логического значения в любом случае эффективно.
b1nary.atr0phy
10
@ ThorbjørnRavnAndersen Я не имею никакого контроля над тем, как используются мои методы или как часто они вызываются, и в этом суть. Вы жертвуете как производительностью, так и удобочитаемостью, и не получаете никакой ощутимой выгоды.
b1nary.atr0phy
6
Это определенно креативно, но я не могу придумать ни одного преимущества использования этого метода. Это более многословно и (я предполагаю) менее эффективно, но это, безусловно, интересный метод.
объяснение : Как мы знаем, возвращение Boolean.compare по умолчанию равно -1 в случае несоответствия, поэтому +1 сделайте возвращаемое значение равным 0 для Falseи 1 дляTrue
Boolean.compare(myBoolean, false)будет соответствовать лучше в соответствии с приведенным описанием
Vadzim
@Vadzim Да, действительно, сгенерирует 1 и 0 по сравнению с false, а в текущем сценарии сгенерирует 0 и -1. Оба решения хороши и +1 за ваш комментарий :-)
mumair
0
Тот факт, что мне нужно написать метод-обертку вокруг оператора if для приведения значения, просто добавляет к и без того огромному списку причин, по которым java уже должен просто умереть. И видя, что троичный оператор даже не обернут в функцию, а просто скопирован, вставлен везде, я вижу, что логическое приведение к int просто сводит меня с ума. Это пустая трата циклов процессора и оскорбление читабельности кода.
Также большинство ответов здесь содержат сотни откликов с нулевым объяснением, что заставляет меня догадываться, что плохая практика - это просто результат того, что я подвергаюсь воздействию Java. Если бы я написал троичный оператор для приведения логического выражения к int на любом современном языке, меня бы уволили на следующий день с любой работы, которую я мог бы иметь. Поэтому сегодня я перестал пытаться использовать разум в своих java-заданиях и решил принять глупость:
publicstaticint booltoint(boolean nonsense){// Let's start with indenting using spaces, 16 of them to be preciseString[] ____int =newString[500];
____int[0]=Boolean.toString(nonsense);try{Thread.sleep(100);}catch(Exception e){}Random rand =newRandom();int n = rand.nextInt((int)1e9);int result =0;int other_Result =1;for(int i =-5; i <2; i++){try{if(n ==35467247)return5;// let's just fail with one in a billion chanceif((5- ____int[i].length())==1){return++result;}elseif(____int[i]=="false"){return--other_Result;}}catch(Exception e){// This method will throw an exception 5 times every single time I // cast a boolean to int before returning an integer}}return(int)1e35;}
true
иfalse
соответственно?Ответы:
^^
PS: true = 1 и false = 0
источник
(foo && (!bar || baz)) ? 1 : 0
. Очевидно, что если это просто идентификатор, то эти символы не нужны или нежелательны.(boolean expression) ? 1 : 0;
было бы более понятно. Я думаю,my
префикс сделал его похожим на переменную.foo && (!bar || baz) ? 1 : 0
будет синтаксическая ошибка. (Я знаю, что это было 6 лет)источник
Использование троичного оператора - это самый простой, эффективный и самый читаемый способ сделать то, что вы хотите. Я призываю вас использовать это решение.
Однако я не могу удержаться, чтобы предложить альтернативное, надуманное, неэффективное, нечитаемое решение.
Эй, людям нравится голосовать за такие крутые ответы!
редактировать
Между прочим, я часто видел преобразования из логического значения в int с единственной целью - сделать сравнение двух значений (как правило, в реализациях
compareTo
метода).Boolean#compareTo
это путь в этих конкретных случаях.Редактировать 2
Java 7 представила новую служебную функцию, которая работает непосредственно с примитивными типами
Boolean#compare
(спасибо, shmosel )источник
Boolean.compare()
и избежать автобокс. 2. В документацииBoolean.compareTo()
не говорится, что она вернет 1, только «положительное значение, если этот объект представляет истину, а аргумент представляет ложь».источник
5 - b.toString().length
просто
источник
источник
BooleanUtils.toInteger
реализован как разreturn bool ? 1 : 0;
.Это зависит от ситуации. Часто самый простой подход - лучший, потому что его легко понять:
или
Но иногда полезно использовать Enum вместо логического флага. Представим себе, что существуют синхронные и асинхронные процессы:
В Java enum может иметь дополнительные атрибуты и методы:
источник
?:
заключается в том, что вы можете устанавливать точки останова внутри блоков if.Если вы используете Apache Commons Lang (который, как я думаю, используют многие проекты), вы можете просто использовать его так:
toInteger
метод возвращает 1, еслиboolean_expression
истина, 0 в противном случаеисточник
BooleanUtils.toInteger
реализован как разreturn bool ? 1 : 0;
.Если
true -> 1
иfalse -> 0
сопоставление это то, что вы хотите, вы можете сделать:источник
Если вы хотите запутать, используйте это:
источник
Давайте подшучиваем
Boolean.compare(boolean, boolean)
. Поведение функции по умолчанию: если оба значения равны, в0
противном случае возвращается-1
.объяснение : Как мы знаем, возвращение Boolean.compare по умолчанию равно -1 в случае несоответствия, поэтому +1 сделайте возвращаемое значение равным 0 для
False
и 1 дляTrue
источник
Boolean.compare(myBoolean, false)
будет соответствовать лучше в соответствии с приведенным описаниемТот факт, что мне нужно написать метод-обертку вокруг оператора if для приведения значения, просто добавляет к и без того огромному списку причин, по которым java уже должен просто умереть. И видя, что троичный оператор даже не обернут в функцию, а просто скопирован, вставлен везде, я вижу, что логическое приведение к int просто сводит меня с ума. Это пустая трата циклов процессора и оскорбление читабельности кода.
Также большинство ответов здесь содержат сотни откликов с нулевым объяснением, что заставляет меня догадываться, что плохая практика - это просто результат того, что я подвергаюсь воздействию Java. Если бы я написал троичный оператор для приведения логического выражения к int на любом современном языке, меня бы уволили на следующий день с любой работы, которую я мог бы иметь. Поэтому сегодня я перестал пытаться использовать разум в своих java-заданиях и решил принять глупость:
источник
Тогда используйте:
источник