Преобразовать логическое значение в int в Java


350

Что является наиболее общепринятым способом , чтобы преобразовать booleanв intв Java?


8
Как вы думаете, какие целые числа соответствуют trueи falseсоответственно?
Турбьерн Равн Андерсен

4
Некоторые языки имеют неявное преобразование из int в логическое значение. Ява не Однако в официальной реализации есть пакеты SQL, и я считаю, что они конвертируют «false» в 0.
hpique

4
@Peter Lawrey Нет, если вы хотите взаимодействовать с другими системами, для которых логический тип не является числовым типом.
hpique

6
@Peter Lawrey Вопрос на самом деле не в отображении стоимости. Речь идет о том, как сделать преобразование наиболее понятным и приемлемым способом.
hpique

7
Технически, компилятор Java уже определяет отображение. True и False компилируются в 1 и 0 соответственно.
Сурьма

Ответы:


583
int myInt = myBoolean ? 1 : 0;

^^

PS: true = 1 и false = 0


59
В случае, когда myBoolean обозначает логическое выражение, использование круглых скобок более читабельно.
rsp

40
Да, как в (foo && (!bar || baz)) ? 1 : 0. Очевидно, что если это просто идентификатор, то эти символы не нужны или нежелательны.
Blrfl

хороший трюк с логическим! Я искал, может ли существовать какое-то приведение типа (int) true = 1, но
отмечал

1
для начинающих, как я, (boolean expression) ? 1 : 0;было бы более понятно. Я думаю, myпрефикс сделал его похожим на переменную.
Дикшом

12
@Blrfl в вашем примере скобки обязательны , а не читаемы . foo && (!bar || baz) ? 1 : 0будет синтаксическая ошибка. (Я знаю, что это было 6 лет)
Конрад Моравский


59

Использование троичного оператора - это самый простой, эффективный и самый читаемый способ сделать то, что вы хотите. Я призываю вас использовать это решение.

Однако я не могу удержаться, чтобы предложить альтернативное, надуманное, неэффективное, нечитаемое решение.

int boolToInt(Boolean b) {
    return b.compareTo(false);
}

Эй, людям нравится голосовать за такие крутые ответы!

редактировать

Между прочим, я часто видел преобразования из логического значения в int с единственной целью - сделать сравнение двух значений (как правило, в реализациях compareToметода).Boolean#compareToэто путь в этих конкретных случаях.

Редактировать 2

Java 7 представила новую служебную функцию, которая работает непосредственно с примитивными типами Boolean#compare(спасибо, shmosel )

int boolToInt(boolean b) {
    return Boolean.compare(b, false);
}

1
Будут выделены современными 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 .
Турбьёрн Равн Андерсен

48
boolean b = ....; 
int i = -("false".indexOf("" + b));

14
Я думаю, что это было бы лучше подходит как комментарий, а не как ответ.
hpique 25.09.10

164
5 - b.toString().length
Кеннитм

5
@ ThorbjørnRavnAndersen Да. Использование одного из других, более эффективных, опубликованных методов, которые не требуют таких накладных расходов. Если вы не можете объяснить, как создание строковых объектов для простой проверки значения логического значения в любом случае эффективно.
b1nary.atr0phy

10
@ ThorbjørnRavnAndersen Я не имею никакого контроля над тем, как используются мои методы или как часто они вызываются, и в этом суть. Вы жертвуете как производительностью, так и удобочитаемостью, и не получаете никакой ощутимой выгоды.
b1nary.atr0phy

6
Это определенно креативно, но я не могу придумать ни одного преимущества использования этого метода. Это более многословно и (я предполагаю) менее эффективно, но это, безусловно, интересный метод.
Майк Бакстер



14

Это зависит от ситуации. Часто самый простой подход - лучший, потому что его легко понять:

if (something) {
    otherThing = 1;
} else {
    otherThing = 0;
}

или

int otherThing = something ? 1 : 0;

Но иногда полезно использовать Enum вместо логического флага. Представим себе, что существуют синхронные и асинхронные процессы:

Process process = Process.SYNCHRONOUS;
System.out.println(process.getCode());

В Java enum может иметь дополнительные атрибуты и методы:

public enum Process {

    SYNCHRONOUS (0),
    ASYNCHRONOUS (1);

    private int code;
    private Process (int code) {
        this.code = code;
    }

    public int getCode() {
        return code;
    }
}

6
Дополнительная причина использования if вместо ?:заключается в том, что вы можете устанавливать точки останова внутри блоков if.
Торбьерн Равн Андерсен

12

Если вы используете Apache Commons Lang (который, как я думаю, используют многие проекты), вы можете просто использовать его так:

int myInt = BooleanUtils.toInteger(boolean_expression); 

toIntegerметод возвращает 1, если boolean_expressionистина, 0 в противном случае


FWIW, BooleanUtils.toIntegerреализован как раз return bool ? 1 : 0;.
Соломон Уко

8

Если true -> 1и false -> 0сопоставление это то, что вы хотите, вы можете сделать:

boolean b = true;
int i = b ? 1 : 0; // assigns 1 to i.

6

Если вы хотите запутать, используйте это:

System.out.println( 1 & Boolean.hashCode( true ) >> 1 );  // 1
System.out.println( 1 & Boolean.hashCode( false ) >> 1 ); // 0

3

Давайте подшучиваем Boolean.compare(boolean, boolean). Поведение функции по умолчанию: если оба значения равны, в 0противном случае возвращается -1.

public int valueOf(Boolean flag) {
   return Boolean.compare(flag, Boolean.TRUE) + 1;
}

объяснение : Как мы знаем, возвращение Boolean.compare по умолчанию равно -1 в случае несоответствия, поэтому +1 сделайте возвращаемое значение равным 0 для Falseи 1 дляTrue


3
Boolean.compare(myBoolean, false)будет соответствовать лучше в соответствии с приведенным описанием
Vadzim

@Vadzim Да, действительно, сгенерирует 1 и 0 по сравнению с false, а в текущем сценарии сгенерирует 0 и -1. Оба решения хороши и +1 за ваш комментарий :-)
mumair

0

Тот факт, что мне нужно написать метод-обертку вокруг оператора if для приведения значения, просто добавляет к и без того огромному списку причин, по которым java уже должен просто умереть. И видя, что троичный оператор даже не обернут в функцию, а просто скопирован, вставлен везде, я вижу, что логическое приведение к int просто сводит меня с ума. Это пустая трата циклов процессора и оскорбление читабельности кода.

Также большинство ответов здесь содержат сотни откликов с нулевым объяснением, что заставляет меня догадываться, что плохая практика - это просто результат того, что я подвергаюсь воздействию Java. Если бы я написал троичный оператор для приведения логического выражения к int на любом современном языке, меня бы уволили на следующий день с любой работы, которую я мог бы иметь. Поэтому сегодня я перестал пытаться использовать разум в своих java-заданиях и решил принять глупость:

public static int booltoint(boolean nonsense) {
                                // Let's start with indenting using spaces, 16 of them to be precise
                                String[] ____int = new String[500];
                                ____int[0] = Boolean.toString(nonsense);
                                try {
                                                Thread.sleep(100); 
                                } catch (Exception e) {    }
                                Random rand = new Random();
                                int n = rand.nextInt((int)1e9);
                                int result = 0;
                                int other_Result = 1;
                                for (int i = -5; i < 2; i++) {
                                                try {
                                                                if (n == 35467247) return 5; // let's just fail with one in a billion chance
                                                                if ((5 - ____int[i].length()) == 1) {
                                                                                return ++result;
                                                                } else if(____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;}

-1
public static int convBool(boolean b)
{
int convBool = 0;
if(b) convBool = 1;
return convBool;
}

Тогда используйте:

convBool(aBool);
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.