Який найприйнятніший спосіб перетворити 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;
.
Якщо true -> 1
і false -> 0
картографування - те, що ви хочете, ви можете зробити:
boolean b = true;
int i = b ? 1 : 0; // assigns 1 to i.
Якщо ви хочете облудити, скористайтеся цим:
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, якщо для перерахування значення, просто додає до вже величезного списку причин, чому ява повинен просто померти. І бачачи, що потрійний оператор навіть не завершений у функцію, а просто копіюється скріплено скрізь, я бачу булевий відступ до int, просто приводить мене в горіхи. Це марність циклів процесора та образа читабельності коду.
Крім того, більшість відповідей тут мають сотні оновлень з нульовим поясненням, що змушує мене гадати, що погана практика - це лише результат того, що ява так сильно піддається впливу. Якби я написав потрійного оператора, який давав бити бул до 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
відповідно?