Что является наиболее общепринятым способом , чтобы преобразовать boolean
в int
в Java?
Что является наиболее общепринятым способом , чтобы преобразовать boolean
в int
в Java?
Ответы:
int myInt = myBoolean ? 1 : 0;
^^
PS: true = 1 и false = 0
(foo && (!bar || baz)) ? 1 : 0
. Очевидно, что если это просто идентификатор, то эти символы не нужны или нежелательны.
(boolean expression) ? 1 : 0;
было бы более понятно. Я думаю, my
префикс сделал его похожим на переменную.
foo && (!bar || baz) ? 1 : 0
будет синтаксическая ошибка. (Я знаю, что это было 6 лет)
Использование троичного оператора - это самый простой, эффективный и самый читаемый способ сделать то, что вы хотите. Я призываю вас использовать это решение.
Однако я не могу удержаться, чтобы предложить альтернативное, надуманное, неэффективное, нечитаемое решение.
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);
}
Boolean.compare()
и избежать автобокс. 2. В документации Boolean.compareTo()
не говорится, что она вернет 1, только «положительное значение, если этот объект представляет истину, а аргумент представляет ложь».
boolean b = ....;
int i = -("false".indexOf("" + b));
5 - b.toString().length
import org.apache.commons.lang3.BooleanUtils;
boolean x = true;
int y= BooleanUtils.toInteger(x);
BooleanUtils.toInteger
реализован как раз return bool ? 1 : 0;
.
Это зависит от ситуации. Часто самый простой подход - лучший, потому что его легко понять:
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;
}
}
?:
заключается в том, что вы можете устанавливать точки останова внутри блоков if.
Если вы используете Apache Commons Lang (который, как я думаю, используют многие проекты), вы можете просто использовать его так:
int myInt = BooleanUtils.toInteger(boolean_expression);
toInteger
метод возвращает 1, если boolean_expression
истина, 0 в противном случае
BooleanUtils.toInteger
реализован как раз return bool ? 1 : 0;
.
Если вы хотите запутать, используйте это:
System.out.println( 1 & Boolean.hashCode( true ) >> 1 ); // 1
System.out.println( 1 & Boolean.hashCode( false ) >> 1 ); // 0
Давайте подшучиваем 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
Boolean.compare(myBoolean, false)
будет соответствовать лучше в соответствии с приведенным описанием
Тот факт, что мне нужно написать метод-обертку вокруг оператора 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;}
true
иfalse
соответственно?