theBoolean = !theBoolean;
Это ... действительно очевидно - ой! Не знаю, почему я не подумал об этом. Спасибо.
! Логическое значение кажется естественным выбором - возможно, в будущем.
@ypnos: !!bool == !(!(bool)) == bool
.
@ ChristofferHammarström По этой логике, тогда не должно быть --integer == - (- (integer)) == integer?
@ user515655 - Язык определяет оператор --
(фактически, два из них вместе с двумя операторами ++
), но не определяет оператор !!
. Если вам нужен -(-(integer))
, вы можете использовать пробел между двумя символами -
. Но !!
анализирует как два оператора !
независимо от пробелов.
В таком случае как насчет bool!!
theBoolean ^= true;
Меньше нажатий клавиш, если ваша переменная длиннее четырех букв
Редактировать: код имеет тенденцию возвращать полезные результаты при использовании в качестве условий поиска Google. В приведенном выше коде нет. Для тех, кому это нужно, это побитовое XOR как описано здесь.
Краткость - душа остроумия.
Теперь я могу небрежно отбрасывать имена (синтаксис?) XOR, чтобы круто выглядеть перед моими друзьями-программистами. Ваш ответ должен сливаться с избранным, вместе они чистое совершенство.
@ScottStanchfield Такие люди должны этому научиться. Это совсем несложно, это не взлом, и незнание этого часто приводит к дрянному коду, например один этот вопрос. Это настоящий прорыв - пять строк с использованием стандартных условных обозначений!
Подумайте о том, чтобы «выучить» или «попытаться понять, что происходит, когда у вас есть день, чтобы исправить ошибку». Да, XOR здесь круто, но сколько людей, которым я упомянул XOR, сказали «а?» потрясающе. Вы всегда должны писать код для обслуживающего программиста, максимально упрощая его работу, потому что независимо от того, насколько хорошо написан код, чтение чужого кода действительно отстой.
Но ... это позволяет параметризовать отрицание :) theBoolean ^= shouldBeNegated;
theBoolean = !theBoolean;
или theBoolean = theBoolean ? false : true;
@BlaineKasten, по-видимому, больше нет. Все работает с одинаковой скоростью (FF43, 64-разрядная версия Ubuntu 15) Обновлено: Это на 50% медленнее для меня в Chrome 47, в то время как троичный имеет скорость «бесконечность».
Если вы объявляете логическую константу со значением true
в классе T
и называете ее t
, то вы можете сохранить одно дополнительное нажатие клавиши: myVal ^= T.t;
. Не говоря уже о статическом импорте ... myVal ^= t;
... Безлимитный пух!
@BlaineKasten - В Chrome 55 на OS X это самый медленный результат на 53%. Интересно, что тернарное выражение является самым быстрым.
До:
boolean result = isresult();
if (result) {
result = false;
} else {
result = true;
}
После:
boolean result = isresult();
result ^= true;
Кто хоть раз голосовал против? Не могли бы вы также объяснить причину?
Я могу придумать две основные причины, по которым кто-то мог проголосовать против вас: 1) Некромантия потоков (Ну же! вопрос был задан 7 (!) лет назад!) и ваш ответ не приносит ничего нового в таблицу; 2) Избиратель ожидал чего-то «более чистого» (читать: короче) - ответ Аарона Маенпаа является ярким примером этого.
@Elltz: Напротив - я фактически поддержал его, поскольку ответ был технически правильным. Однако я должен сказать, что мне не нравится тенденция бутлегерства ответов предыдущих пользователей на дешевую карму (см. Ответ nlaq).
@PriiduNeemre, заданный вопрос и ответ принят до 7+ лет, и как вы думаете, кроме вашего списка, кто-нибудь отдаст свой голос? кроме этого ваш ответ тоже не на высоте .. :(
после: логический результат =! isresult ();
"Очевидный" способ (для большинства людей)
theBoolean = !theBoolean;
Самый "короткий" путь (большую часть времени)
theBoolean ^= true;
Самый "наглядный" способ (наиболее неопределенно)
theBoolean = theBoolean ? false : true;
theMethod( theBoolean ^= true );
Поскольку оператор присваивания всегда возвращает то, что было присвоено, он переключит значение с помощью побитового оператора, а затем вернет вновь присвоенное значение, которое будет использоваться в вызове метода.
Оберните реализацию в функцию / метод под названием toggle, и тогда почти не будет возможности запутать его.
@Reiner: Для C
определенно, но в Java
не разрешено смешивать логические и целые числа (также такие вещи, как while(1)
, невозможны в Java).
@Lambage: Верно, но с другой стороны, вы не можете переключить логическое значение, просто передав его, поскольку в Java невозможно передавать примитивы по ссылке. Вам придется переназначить результат метода вашей переменной или иным образом создать класс-оболочку для логического значения.
Вышеупомянутый "очевидный способ" помечается SONAR с помощью - Следует избегать внутренних назначений.
Если вы используете логические значения 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
Хороший подход, но не совсем однозначный (имхо). Кто-то, использующий / читающий просто «toggle (..)», может подумать, что вызов метода (без повторного присвоения его переменной) может уже переключить базовую переменную. Сейчас для нас очевидно, что мы видим код, но в реальной жизни может быть довольно сложно отладить. Лучшее название метода могло бы быть «противоположным» или, возможно, «отрицанием», чтобы сделать это несколько более очевидным; или используйте первый подход с объектом Boolean
и действительно переключите его внутри метода (но все же несколько неоднозначно).
Если вы не делаете ничего особенно профессионального, вы всегда можете использовать класс 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. Однако не знаю, что такое отраслевой стандарт. (Опытные программисты меня поправляют)
Проголосовали против. 1. Это не улучшает читаемость. 2. Это добавляет серьезные накладные расходы времени выполнения. 3. Утильные классы обычно представляют собой запах кода.
Этот ответ возник при поиске «java invert boolean function». В приведенном ниже примере предотвращается сбой сборки некоторых инструментов статического анализа из-за логики ветвления. Это полезно, если вам нужно инвертировать логическое значение и вы не создали исчерпывающих модульных тестов;)
Boolean.valueOf(aBool).equals(false)
или альтернативно:
Boolean.FALSE.equals(aBool)
или же
Boolean.FALSE::equals
Мне нравится то, что вы можете передать Boolean.FALSE::equals
в функцию сопоставления вместо того, чтобы писать небольшую лямбду.
Класс BooleanUtils
поддерживает отрицание логического значения. Вы найдете этот класс в commons-lang: commons-lang
BooleanUtils.negate(theBoolean)
К сожалению, нет краткой формы, например, у чисел есть увеличение / уменьшение:
i ++;
Я хотел бы иметь аналогичное короткое выражение для инвертирования логического значения dmth, например:
пусто!;
Не уверен, почему вы говорите это, когда на этот вопрос был дан ответ в этой беседе двенадцать лет назад.
о, хорошо, я собирался задать тот же вопрос, хотя мой вопрос был бы специфическим для javascript / as3 или ECMAScript в целом, я полагаю ... который легко будет охвачен этим вопросом.