Есть ли лучший способ отрицать логическое значение в Java, чем простой if-else?
if (theBoolean) {
theBoolean = false;
} else {
theBoolean = true;
}
Есть ли лучший способ отрицать логическое значение в Java, чем простой if-else?
if (theBoolean) {
theBoolean = false;
} else {
theBoolean = true;
}
Ответы:
theBoolean = !theBoolean;
!!bool == !(!(bool)) == bool
.
--
оператор (фактически два из них вместе с двумя ++
операторами), но не определяет !!
оператор. Если вы хотите, -(-(integer))
вы можете использовать пробел между двумя -
символами. Но !!
разбирается как два !
оператора независимо от пробела.
theBoolean ^= true;
Меньше нажатий клавиш, если ваша переменная длиннее четырех букв
Изменить : код имеет тенденцию возвращать полезные результаты при использовании в качестве поисковых терминов Google. Код выше не делает. Для тех, кому это нужно, это побитовый XOR, как описано здесь .
theBoolean = !theBoolean;
илиtheBoolean = theBoolean ? false : true;
«Очевидный» способ (для большинства людей)
theBoolean = !theBoolean;
Самый короткий путь (большую часть времени)
theBoolean ^= true;
«Самый наглядный» способ (самый неуверенный)
theBoolean = theBoolean ? false : true;
theMethod( theBoolean ^= true );
Так как оператор присваивания всегда возвращает то, что было назначено, это переключит значение с помощью побитового оператора, а затем вернет вновь присвоенное значение, которое будет использовано в вызове метода.
C
, но в Java
нем нельзя смешивать булево и целое число (такие вещи как while(1)
невозможны в Java).
Если вы используете логические значения NULL и считаете их ложными, попробуйте это:
static public boolean toggle(Boolean aBoolean) {
if (aBoolean == null) return true;
else return !aBoolean;
}
Если вы не обрабатываете логические значения NULL, попробуйте это:
static public boolean toggle(boolean aBoolean) {
return !aBoolean;
}
Это самые чистые, потому что они показывают намерение в сигнатуре метода, их легче читать по сравнению с ! оператор, и может быть легко отлажен.
использование
boolean bTrue = true
boolean bFalse = false
boolean bNull = null
toggle(bTrue) // == false
toggle(bFalse) // == true
toggle(bNull) // == true
Конечно, если вы используете Groovy или язык, который допускает методы расширения, вы можете зарегистрировать расширение и просто сделать:
Boolean b = false
b = b.toggle() // == true
Boolean
и действительно переключайте его в методе (но все еще несколько двусмысленно).
Этот ответ возник при поиске «булевой функции Java Invert Boolean». Приведенный ниже пример предотвратит сбой сборок некоторыми инструментами статического анализа из-за логики ветвления. Это полезно, если вам нужно инвертировать логическое значение и не создавать комплексные модульные тесты;)
Boolean.valueOf(aBool).equals(false)
или альтернативно:
Boolean.FALSE.equals(aBool)
или
Boolean.FALSE::equals
Boolean.FALSE::equals
к картографической функции вместо того, чтобы написать небольшую лямбду
Если вы не занимаетесь чем-то особенно профессиональным, вы всегда можете использовать класс Util. Например, класс утилит из проекта для класса.
public class Util {
public Util() {}
public boolean flip(boolean bool) { return !bool; }
public void sop(String str) { System.out.println(str); }
}
затем просто создайте объект Util
Util u = new Util();
и получите что-то для возвратаSystem.out.println( u.flip(bool) );
Если вы собираетесь использовать одно и то же снова и снова, используйте метод, и особенно если он используется в разных проектах, создайте класс Util. Не знаю, что такое отраслевой стандарт. (Опытные программисты не стесняются меня поправлять)
Класс BooleanUtils
поддерживает отрицание логического значения. Вы найдете этот класс в Commons-Lang: Commons-Lang
BooleanUtils.negate(theBoolean)
Перед:
boolean result = isresult();
if (result) {
result = false;
} else {
result = true;
}
После:
boolean result = isresult();
result ^= true;