Какой самый краткий способ получить обратное логическое значение Java?

Если у вас есть логическая переменная:

boolean myBool = true;

Я мог бы получить обратное с помощью предложения if / else:

if (myBool == true)
 myBool = false;
else
 myBool = true;

Есть ли более лаконичный способ сделать это?


person faq    schedule 11.10.2010    source источник
comment
BoltClock предлагает оптимальный ответ; Однако я хотел бы отметить, что if (myBool == true) сам по себе уже очень болтлив; if (myBool) делает то же самое.   -  person phisch    schedule 11.10.2010
comment
@phisch: if ((!myBool != true || false) && (!(myBool != false || true) == false))   -  person BoltClock    schedule 11.10.2010
comment
myBool = (myBool)? ложь Правда; (потому что я просто не могу отказаться от возможности использовать троичную форму, даже если она не самая краткая)   -  person KevinDTimm    schedule 11.10.2010
comment
Он забыл о подтяжках. если (myBool == true) {myBool = false; } ... :-)   -  person James Schek    schedule 11.10.2010
comment
if (myBool == true), eek. Связанный: Это плохо явно сравнивать с логическими константами, например if (b == false) в Java?   -  person BalusC    schedule 11.10.2010
comment
кстати, объектно-ориентированная версия xD myBool = Boolean.FALSE.equals(myBool);   -  person fortran    schedule 19.02.2013


Ответы (5)


Просто назначьте, используя логический оператор НЕ !, как вы обычно делаете это в своих операторах условий (if, for, _4 _...). Вы уже работаете с логическим значением, поэтому оно перевернет true на false (и наоборот):

myBool = !myBool;
person BoltClock    schedule 11.10.2010
comment
Это действительно более лаконично. Но я хотел бы отметить, что ответ от bvdb касается правильной обработки Boolean - person buzzsawddog; 03.07.2014

Еще более крутой способ (более краткий, чем myBool = !myBool для имен переменных длиной более 4 символов, если вы хотите установить переменную):

myBool ^= true;

И, кстати, не используйте if (something == true), проще, если вы просто сделаете if (something) (то же самое со сравнением с false, используйте оператор отрицания).

person fortran    schedule 11.10.2010
comment
Черт возьми, XOR! +1 - person BoltClock; 11.10.2010
comment
Это те мелочи, которые делают бесконечные часы программирования веселее xD - person fortran; 11.10.2010
comment
Я надеялся найти краткий синтаксис, который мои коллеги будут понимать интуитивно, без необходимости задавать вопросы в StackOverflow, чтобы понять, что я делаю. - person faq; 11.10.2010
comment
Вы не думаете о хорошем! Подумайте о просветлении, которое они получат после того, как некоторое время просматривают ТАК, пытаясь понять, что вы делаете !!! :-п - person fortran; 11.10.2010
comment
Ты прав. Посмотрим, что они думают о наших усилиях по их просвещению. - person faq; 11.10.2010
comment
Они будут в восторге, я вам это скажу! :-D - person fortran; 11.10.2010
comment
как насчет myBool = (myBool == false);? - person Jorn; 11.10.2010
comment
@faq: Вы совершенно упустили суть! Цель программирования - не писать программы, понятные другим. Это писать программы, которые настолько сложны, что любой, кто их читает, сразу же впечатляется тем, насколько умными вы должны были быть, чтобы написать это. :) - person Jay; 11.10.2010
comment
@Jay, или как сказал бы мой друг: «Если бы это было трудно писать, это должно быть трудно читать! XD - person fortran; 13.10.2010
comment
Каковы преимущества побитового XOR-метода? (Кроме крутости). - person Usman Ismail; 09.04.2014
comment
никаких преимуществ, просто для того, чтобы подслушать ваших товарищей ... (и это не побитовый оператор, это логический оператор, поскольку он применяется к логическим операндам!) - person fortran; 10.04.2014
comment
Это отличное решение. Сказать myBool = !myBool позволяет только точно перевернуть логическое значение. Но myBool ^= true можно обобщить как myBool ^= reverse, что позволяет вам выборочно инвертировать его логическое значение. - person Paul Schwarz; 02.09.2018

Для boolean это довольно просто, для Boolean немного сложнее.

  • boolean имеет только 2 возможных состояния: trueи false.
  • Boolean, с другой стороны, имеет 3: Boolean.TRUE, Boolean.FALSE или null.

Предполагая, что вы имеете дело только с boolean (который является примитивным типом), проще всего сделать следующее:

boolean someValue = true; // or false
boolean negative = !someValue;

Однако, если вы хотите инвертировать Boolean (который является объектом), вам нужно следить за значением null, иначе вы можете получить NullPointerException.

Boolean someValue = null;
Boolean negativeObj = !someValue.booleanValue(); --> throws NullPointerException.

Предполагая, что это значение никогда не может быть нулевым и что ваша компания или организация не имеет правил кода, запрещающих автоматическое (снятие) бокса. На самом деле вы можете просто написать это в одну строку.

Boolean someValue = Boolean.TRUE; // or Boolean.FALSE
Boolean negativeObj = !someValue;

Однако, если вы хотите позаботиться и о значениях null. Тогда есть несколько интерпретаций.

boolean negative = !Boolean.TRUE.equals(someValue); //--> this assumes that the inverse of NULL should be TRUE.

// if you want to convert it back to a Boolean object, then add the following.
Boolean negativeObj = Boolean.valueOf(negative);

С другой стороны, если вы хотите, чтобы null оставался null после инверсии, вы можете рассмотреть возможность использования класса apache commons _22 _ (см. javadoc)

Boolean someValue = null; // or Boolean.TRUE or Boolean.FALSE;
Boolean negativeObj = BooleanUtils.negate(someValue);

Некоторые предпочитают просто записать все это, чтобы избежать зависимости от apache.

Boolean someValue = null; // or Boolean.TRUE or Boolean.FALSE;
Boolean negative = (someValue == null)? null : Boolean.valueOf(!someValue.booleanValue());
person bvdb    schedule 21.04.2014
comment
Спасибо за этот ответ. Я считаю, что принятый ответ действительно более лаконичен. НО мне кажется, ваш ответ более полный! Спасибо за освещение boolean И Boolean - person buzzsawddog; 03.07.2014

Самый краткий способ - не инвертировать логическое значение, а просто использовать! MyBool позже в коде, когда вы хотите проверить противоположное условие.

person Daniel Widdis    schedule 18.02.2012
comment
вы правы, но иногда нужно это делать, если действительно меняется флаг - person fortran; 12.09.2013

person    schedule
comment
скопировал из комментария к вопросу? - person Jorn; 12.10.2010
comment
Нет ли разницы между обоими? - person Jinjavacoder; 12.10.2010