Czy istnieje lepszy sposób na zanegowanie wartości logicznej w Javie niż zwykły if-else?
if (theBoolean) {
theBoolean = false;
} else {
theBoolean = true;
}
Czy istnieje lepszy sposób na zanegowanie wartości logicznej w Javie niż zwykły if-else?
if (theBoolean) {
theBoolean = false;
} else {
theBoolean = true;
}
Odpowiedzi:
theBoolean = !theBoolean;
!!bool == !(!(bool)) == bool
.
--
operatora (w rzeczywistości dwóch z nich wraz z dwoma ++
operatorami), ale nie definiuje !!
operatora. Jeśli chcesz -(-(integer))
, możesz użyć spacji między dwoma -
znakami. Ale !!
parsuje jako dwa !
operatory niezależnie od białych znaków.
theBoolean ^= true;
Mniej naciśnięć klawiszy, jeśli zmienna ma więcej niż cztery litery
Edycja : kod zwykle zwraca przydatne wyniki, gdy jest używany jako wyszukiwane hasło Google. Powyższy kod nie. Dla tych, którzy go potrzebują, jest to bitowy XOR, jak opisano tutaj .
theBoolean = !theBoolean;
lubtheBoolean = theBoolean ? false : true;
„Oczywisty” sposób (dla większości osób)
theBoolean = !theBoolean;
„Najkrótsza” droga (przez większość czasu)
theBoolean ^= true;
„Najbardziej wizualny” sposób (najbardziej niepewny)
theBoolean = theBoolean ? false : true;
theMethod( theBoolean ^= true );
Ponieważ operator przypisania zawsze zwraca to, co zostało przypisane, spowoduje to przełączenie wartości za pomocą operatora bitowego, a następnie zwróci nowo przypisaną wartość do użycia w wywołaniu metody.
C
pewno, ale w Java
nim nie wolno mieszać wartości logicznych i całkowitych (również takie rzeczy while(1)
nie są możliwe w Javie).
Jeśli używasz boolowskich wartości NULL i uznajesz je za fałszywe, spróbuj tego:
static public boolean toggle(Boolean aBoolean) {
if (aBoolean == null) return true;
else return !aBoolean;
}
Jeśli nie przekazujesz boolowskich wartości NULL, spróbuj tego:
static public boolean toggle(boolean aBoolean) {
return !aBoolean;
}
Są to najczystsze, ponieważ pokazują intencję w metodzie, są łatwiejsze do odczytania w porównaniu do ! operatora i można go łatwo debugować.
Stosowanie
boolean bTrue = true
boolean bFalse = false
boolean bNull = null
toggle(bTrue) // == false
toggle(bFalse) // == true
toggle(bNull) // == true
Oczywiście, jeśli używasz Groovy lub języka, który pozwala na metody rozszerzeń, możesz zarejestrować rozszerzenie i po prostu zrobić:
Boolean b = false
b = b.toggle() // == true
Boolean
i naprawdę przełącz go w ramach metody (ale nadal nieco niejednoznacznej).
Ta odpowiedź pojawiła się podczas wyszukiwania „jaolowej inwertowanej funkcji boolean”. Poniższy przykład zapobiegnie niepowodzeniom niektórych narzędzi analizy statycznej z powodu logiki rozgałęziania. Jest to przydatne, jeśli trzeba odwrócić wartość logiczną i nie opracowano kompleksowych testów jednostkowych;)
Boolean.valueOf(aBool).equals(false)
lub alternatywnie:
Boolean.FALSE.equals(aBool)
lub
Boolean.FALSE::equals
Boolean.FALSE::equals
do funkcji mapowania zamiast pisać małą lambda
Jeśli nie robisz nic szczególnie profesjonalnego, zawsze możesz skorzystać z klasy Util. Ex, klasa util z projektu dla klasy.
public class Util {
public Util() {}
public boolean flip(boolean bool) { return !bool; }
public void sop(String str) { System.out.println(str); }
}
następnie po prostu utwórz obiekt Util
Util u = new Util();
i coś do zwrotuSystem.out.println( u.flip(bool) );
Jeśli będziesz używać tej samej metody w kółko, użyj metody, a zwłaszcza, jeśli dotyczy to różnych projektów, stwórz klasę Util. Nie wiem jednak, jaki jest standard branżowy. (Doświadczeni programiści mogą mnie poprawić)
Klasa BooleanUtils
popiera negację wartości logicznej. Znajdziesz tę klasę w commons-lang: commons-lang
BooleanUtils.negate(theBoolean)
Przed:
boolean result = isresult();
if (result) {
result = false;
} else {
result = true;
}
Po:
boolean result = isresult();
result ^= true;