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

Есть ли лучший способ отрицать логическое значение в Java, чем простое if-else?

if (theBoolean) {
    theBoolean = false;
} else {
    theBoolean = true;
}

о, хорошо, я собирался задать тот же вопрос, хотя мой вопрос был бы специфическим для javascript / as3 или ECMAScript в целом, я полагаю ... который легко будет охвачен этим вопросом.

matt lohkamp 07.01.2009 09:36

Что делать, если нет! оператор ??

onmyway133 12.09.2014 11:10
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
218
2
164 649
9
Перейти к ответу Данный вопрос помечен как решенный

Ответы 9

Ответ принят как подходящий
theBoolean = !theBoolean;

Это ... действительно очевидно - ой! Не знаю, почему я не подумал об этом. Спасибо.

Kevin Griffin 22.10.2008 06:46

! Логическое значение кажется естественным выбором - возможно, в будущем.

matt lohkamp 07.01.2009 09:38

@ypnos: !!bool == !(!(bool)) == bool.

Christoffer Hammarström 21.07.2011 16:27

@ ChristofferHammarström По этой логике, тогда не должно быть --integer == - (- (integer)) == integer?

user515655 11.12.2015 07:54

@ user515655 - Язык определяет оператор -- (фактически, два из них вместе с двумя операторами ++), но не определяет оператор !!. Если вам нужен -(-(integer)), вы можете использовать пробел между двумя символами -. Но !! анализирует как два оператора ! независимо от пробелов.

Ted Hopp 27.01.2017 07:11

В таком случае как насчет bool!!

mid 19.07.2017 10:42
theBoolean ^= true;

Меньше нажатий клавиш, если ваша переменная длиннее четырех букв

Редактировать: код имеет тенденцию возвращать полезные результаты при использовании в качестве условий поиска Google. В приведенном выше коде нет. Для тех, кому это нужно, это побитовое XOR как описано здесь.

Краткость - душа остроумия.

Paul Brinkley 23.10.2008 02:47

Теперь я могу небрежно отбрасывать имена (синтаксис?) XOR, чтобы круто выглядеть перед моими друзьями-программистами. Ваш ответ должен сливаться с избранным, вместе они чистое совершенство.

matt lohkamp 07.01.2009 09:39

@ScottStanchfield Такие люди должны этому научиться. Это совсем несложно, это не взлом, и незнание этого часто приводит к дрянному коду, например один этот вопрос. Это настоящий прорыв - пять строк с использованием стандартных условных обозначений!

maaartinus 21.06.2014 17:44

Подумайте о том, чтобы «выучить» или «попытаться понять, что происходит, когда у вас есть день, чтобы исправить ошибку». Да, XOR здесь круто, но сколько людей, которым я упомянул XOR, сказали «а?» потрясающе. Вы всегда должны писать код для обслуживающего программиста, максимально упрощая его работу, потому что независимо от того, насколько хорошо написан код, чтение чужого кода действительно отстой.

Scott Stanchfield 25.06.2014 19:57

Но ... это позволяет параметризовать отрицание :) theBoolean ^= shouldBeNegated;

estani 03.07.2014 14:31
Эта операция также на 12% быстрее., чем другие версии, такие как theBoolean = !theBoolean; или theBoolean = theBoolean ? false : true;
Blaine Kasten 28.07.2014 22:06

@BlaineKasten, по-видимому, больше нет. Все работает с одинаковой скоростью (FF43, 64-разрядная версия Ubuntu 15) Обновлено: Это на 50% медленнее для меня в Chrome 47, в то время как троичный имеет скорость «бесконечность».

Florian Wendelborn 11.01.2016 10:24

Если вы объявляете логическую константу со значением true в классе T и называете ее t, то вы можете сохранить одно дополнительное нажатие клавиши: myVal ^= T.t;. Не говоря уже о статическом импорте ... myVal ^= t; ... Безлимитный пух!

Timmos 21.04.2016 12:46

@BlaineKasten - В Chrome 55 на OS X это самый медленный результат на 53%. Интересно, что тернарное выражение является самым быстрым.

Ted Hopp 27.01.2017 07:15

До:

boolean result = isresult();
if (result) {
    result = false;
} else {
    result = true;
}

После:

boolean result = isresult();
result ^= true;

Кто хоть раз голосовал против? Не могли бы вы также объяснить причину?

Nikhil Kumar 15.04.2015 14:10

Я могу придумать две основные причины, по которым кто-то мог проголосовать против вас: 1) Некромантия потоков (Ну же! вопрос был задан 7 (!) лет назад!) и ваш ответ не приносит ничего нового в таблицу; 2) Избиратель ожидал чего-то «более чистого» (читать: короче) - ответ Аарона Маенпаа является ярким примером этого.

Priidu Neemre 30.04.2015 18:34

@Elltz: Напротив - я фактически поддержал его, поскольку ответ был технически правильным. Однако я должен сказать, что мне не нравится тенденция бутлегерства ответов предыдущих пользователей на дешевую карму (см. Ответ nlaq).

Priidu Neemre 09.06.2015 19:35

@PriiduNeemre, заданный вопрос и ответ принят до 7+ лет, и как вы думаете, кроме вашего списка, кто-нибудь отдаст свой голос? кроме этого ваш ответ тоже не на высоте .. :(

user1140237 11.01.2016 08:30

после: логический результат =! isresult ();

Petter Friberg 14.04.2016 00:24

Есть несколько

"Очевидный" способ (для большинства людей)

theBoolean = !theBoolean;

Самый "короткий" путь (большую часть времени)

theBoolean ^= true;

Самый "наглядный" способ (наиболее неопределенно)

theBoolean = theBoolean ? false : true;

Дополнительно: переключение и использование при вызове метода

theMethod( theBoolean ^= true );

Поскольку оператор присваивания всегда возвращает то, что было присвоено, он переключит значение с помощью побитового оператора, а затем вернет вновь присвоенное значение, которое будет использоваться в вызове метода.

Оберните реализацию в функцию / метод под названием toggle, и тогда почти не будет возможности запутать его.

Lambage 08.09.2017 22:50

@Reiner: Для C определенно, но в Java не разрешено смешивать логические и целые числа (также такие вещи, как while(1), невозможны в Java).

Levite 05.04.2018 19:57

@Lambage: Верно, но с другой стороны, вы не можете переключить логическое значение, просто передав его, поскольку в Java невозможно передавать примитивы по ссылке. Вам придется переназначить результат метода вашей переменной или иным образом создать класс-оболочку для логического значения.

Levite 05.04.2018 19:57

Вышеупомянутый "очевидный способ" помечается SONAR с помощью - Следует избегать внутренних назначений.

Orby 11.04.2018 17:40

Если вы используете логические значения 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 и действительно переключите его внутри метода (но все же несколько неоднозначно).

Levite 01.02.2019 02:58

Если вы не делаете ничего особенно профессионального, вы всегда можете использовать класс 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. Утильные классы обычно представляют собой запах кода.

rds 13.03.2021 16:12

Этот ответ возник при поиске «java invert boolean function». В приведенном ниже примере предотвращается сбой сборки некоторых инструментов статического анализа из-за логики ветвления. Это полезно, если вам нужно инвертировать логическое значение и вы не создали исчерпывающих модульных тестов;)

Boolean.valueOf(aBool).equals(false)

или альтернативно:

Boolean.FALSE.equals(aBool)

или же

Boolean.FALSE::equals

Мне нравится то, что вы можете передать Boolean.FALSE::equals в функцию сопоставления вместо того, чтобы писать небольшую лямбду.

Patrick Parker 11.11.2019 05:31

Класс BooleanUtils поддерживает отрицание логического значения. Вы найдете этот класс в commons-lang: commons-lang

BooleanUtils.negate(theBoolean)

К сожалению, нет краткой формы, например, у чисел есть увеличение / уменьшение:

i ++;

Я хотел бы иметь аналогичное короткое выражение для инвертирования логического значения dmth, например:

пусто!;

Не уверен, почему вы говорите это, когда на этот вопрос был дан ответ в этой беседе двенадцать лет назад.

Luke Perez 14.10.2020 22:23

Другие вопросы по теме