Welche Zahlen würden Sie denken , entsprechen trueund falsejeweils?
Thorbjørn Ravn Andersen
4
Einige Sprachen haben eine implizite Konvertierung von int nach boolean. Java nicht. Die offizielle Implementierung enthält jedoch SQL-Pakete, und ich glaube, diese konvertieren "false" in 0.
hpique
4
@Peter Lawrey Nicht, wenn Sie mit anderen Systemen zusammenarbeiten möchten, die keinen Booleschen Wert als nicht numerischen Datentyp haben.
Hpique
6
@ Peter Lawrey Die Frage bezieht sich nicht wirklich auf die Wertzuordnung. Es geht darum, wie die Konvertierung auf die klarste und akzeptierteste Weise durchgeführt wird.
Hpique
7
Technisch definiert der Java-Compiler bereits ein Mapping. True und False werden zu 1 bzw. 0 kompiliert.
In dem Fall, in dem myBoolean für einen booleschen Ausdruck steht, ist die Verwendung von Klammern besser lesbar.
rsp
40
Ja wie in (foo && (!bar || baz)) ? 1 : 0. Wenn es sich nur um eine Kennung handelt, sind die Parens offensichtlich nicht notwendig oder wünschenswert.
Blrfl
schöner Trick mit Boolean! Ich habe gesucht, dass vielleicht ein Casting wie (int) true = 1 existiert, aber es gibt folgende
Hinweise
1
Für Anfänger wie mich (boolean expression) ? 1 : 0;wäre das verständlicher. Ich denke, das myPräfix hat es wie eine Variable aussehen lassen.
Dixhom
12
@Blrfl in Ihren Beispielklammern ist ein Muss , keine Frage der Lesbarkeit. foo && (!bar || baz) ? 1 : 0wäre ein Syntaxfehler. (Ich weiß, es ist 6 Jahre her)
Die Verwendung des ternären Operators ist die einfachste, effizienteste und am besten lesbare Methode, um das zu tun, was Sie möchten. Ich ermutige Sie, diese Lösung zu verwenden.
Ich kann jedoch nicht widerstehen, eine alternative, erfundene, ineffiziente und unlesbare Lösung vorzuschlagen.
int boolToInt(Boolean b){return b.compareTo(false);}
Hey, die Leute stimmen gerne für so coole Antworten!
Bearbeiten
Übrigens habe ich oft Konvertierungen von einem Booleschen in einen Int gesehen, um einen Vergleich der beiden Werte durchzuführen (im Allgemeinen bei Implementierungen von compareToMethoden). Boolean#compareToist der richtige Weg in diesen speziellen Fällen.
Bearbeiten 2
Java 7 hat eine neue Dienstprogrammfunktion eingeführt, die direkt mit primitiven Typen arbeitet Boolean#compare(Danke shmosel ).
int boolToInt(boolean b){returnBoolean.compare(b,false);}
Wird von modernen JITs eingefügt, also nicht unbedingt ineffizient. Außerdem wird dokumentiert, warum b.compareTo verwendet wird, damit es lesbar ist.
Thorbjørn Ravn Andersen
2
Es kann langsam sein, weil wir den primitiven Wert in ein Objekt einfügen müssen. Die ternäre Operatormethode arbeitet direkt mit primitiven Werten ohne Konvertierung, daher denke ich, dass sie effizienter ist.
Barjak
5
1. Sie können Boolean.compare()das Autoboxing verwenden und vermeiden. 2. Die Dokumentation für Boolean.compareTo()gibt nicht an, dass 1 zurückgegeben wird, sondern nur "ein positiver Wert, wenn dieses Objekt wahr und das Argument falsch darstellt".
Shmosel
1
Ich habe gerade einen Test durchgeführt, bei dem 1.000.000 zufällige Boolesche Werte konvertiert wurden, und diese Methode war durchweg schneller als die auf dem ternären Operator basierende. Es rasierte sich etwa 10 ms ab.
Mapsy
3
@AlexT. Wenn Sie Mikrobenchmarks verwenden, sollten Sie ein Framework verwenden, um sicherzustellen, dass Sie richtig messen. Siehe openjdk.java.net/projects/code-tools/jmh .
Ich denke, dies wäre besser als Kommentar geeignet, nicht als Antwort.
Hpique
164
5 - b.toString().length
Kennytm
5
@ ThorbjørnRavnAndersen Ja. Verwenden Sie eine der anderen, effizienteren Methoden, für die dieser Overhead nicht erforderlich ist. Es sei denn, Sie können erklären, wie das Erstellen von Zeichenfolgenobjekten zum einfachen Überprüfen des Werts eines Booleschen Werts in irgendeiner Weise effizient ist.
b1nary.atr0phy
10
@ ThorbjørnRavnAndersen Ich habe keine Kontrolle darüber, wie meine Methoden verwendet werden oder wie oft sie aufgerufen werden, worum es ganz geht. Sie opfern sowohl Leistung als auch Lesbarkeit für absolut keinen greifbaren Nutzen.
b1nary.atr0phy
6
Es ist definitiv kreativ, aber ich kann mir keinen einzigen Vorteil vorstellen, wenn ich diese Methode verwende. Es ist ausführlicher und (ich vermute) weniger effizient, aber es ist sicher eine interessante Methode.
Aber manchmal ist es nützlich, eine Aufzählung anstelle eines booleschen Flags zu verwenden. Stellen Sie sich vor, es gibt synchrone und asynchrone Prozesse:
Process process =Process.SYNCHRONOUS;System.out.println(process.getCode());
In Java kann enum zusätzliche Attribute und Methoden haben:
Lass uns einen Streich spielen Boolean.compare(boolean, boolean). Standardverhalten der Funktion: Wenn beide Werte gleich sind, wird 0nichts anderes zurückgegeben -1.
Erläuterung : Wie wir wissen, ist die Standardrückgabe von Boolean.compare im Falle einer Fehlanpassung -1, sodass +1 den Rückgabewert auf 0 für Falseund 1 für setztTrue
Boolean.compare(myBoolean, false)würde besser zu der zitierten Beschreibung passen
Vadzim
@Vadzim Ja, tatsächlich werden 1 und 0 durch Vergleich mit false generiert, und im aktuellen Szenario werden 0 und -1 generiert. Beide Lösungen sind in Ordnung und +1 für Ihren Kommentar :-)
mumair
0
Die Tatsache, dass ich eine Wrapper-Methode um eine if-Anweisung zum Umwandeln eines Werts schreiben muss, trägt nur zu der bereits riesigen Liste von Gründen bei, warum Java einfach schon sterben sollte. Und wenn ich sehe, dass der ternäre Operator nicht einmal in eine Funktion eingeschlossen ist, sondern nur überall kopiert wird, sehe ich eine boolesche Umwandlung in int, die mich nur verrückt macht. Es ist eine Verschwendung von CPU-Zyklen und eine Beleidigung der Lesbarkeit des Codes.
Außerdem haben die meisten Antworten hier Hunderte von Upvotes ohne Erklärung, was mich vermuten lässt, dass schlechte Praktiken nur darauf zurückzuführen sind, dass man so viel Java ausgesetzt ist. Wenn ich einen ternären Operator schreiben würde, um Boolesche Werte in einer modernen Sprache in int umzuwandeln, würde ich am nächsten Tag von jedem Job entlassen, den ich haben könnte. Deshalb habe ich heute aufgegeben, Vernunft für meine Java-Aufgaben einzusetzen, und mich entschlossen, Dummheit anzunehmen:
publicstaticint booltoint(boolean nonsense){// Let's start with indenting using spaces, 16 of them to be preciseString[] ____int =newString[500];
____int[0]=Boolean.toString(nonsense);try{Thread.sleep(100);}catch(Exception e){}Random rand =newRandom();int n = rand.nextInt((int)1e9);int result =0;int other_Result =1;for(int i =-5; i <2; i++){try{if(n ==35467247)return5;// let's just fail with one in a billion chanceif((5- ____int[i].length())==1){return++result;}elseif(____int[i]=="false"){return--other_Result;}}catch(Exception e){// This method will throw an exception 5 times every single time I // cast a boolean to int before returning an integer}}return(int)1e35;}
true
undfalse
jeweils?Antworten:
^^
PS: wahr = 1 und falsch = 0
quelle
(foo && (!bar || baz)) ? 1 : 0
. Wenn es sich nur um eine Kennung handelt, sind die Parens offensichtlich nicht notwendig oder wünschenswert.(boolean expression) ? 1 : 0;
wäre das verständlicher. Ich denke, dasmy
Präfix hat es wie eine Variable aussehen lassen.foo && (!bar || baz) ? 1 : 0
wäre ein Syntaxfehler. (Ich weiß, es ist 6 Jahre her)quelle
Die Verwendung des ternären Operators ist die einfachste, effizienteste und am besten lesbare Methode, um das zu tun, was Sie möchten. Ich ermutige Sie, diese Lösung zu verwenden.
Ich kann jedoch nicht widerstehen, eine alternative, erfundene, ineffiziente und unlesbare Lösung vorzuschlagen.
Hey, die Leute stimmen gerne für so coole Antworten!
Bearbeiten
Übrigens habe ich oft Konvertierungen von einem Booleschen in einen Int gesehen, um einen Vergleich der beiden Werte durchzuführen (im Allgemeinen bei Implementierungen von
compareTo
Methoden).Boolean#compareTo
ist der richtige Weg in diesen speziellen Fällen.Bearbeiten 2
Java 7 hat eine neue Dienstprogrammfunktion eingeführt, die direkt mit primitiven Typen arbeitet
Boolean#compare
(Danke shmosel ).quelle
Boolean.compare()
das Autoboxing verwenden und vermeiden. 2. Die Dokumentation fürBoolean.compareTo()
gibt nicht an, dass 1 zurückgegeben wird, sondern nur "ein positiver Wert, wenn dieses Objekt wahr und das Argument falsch darstellt".quelle
5 - b.toString().length
einfach
quelle
quelle
BooleanUtils.toInteger
wird als gerecht implementiertreturn bool ? 1 : 0;
.Das hängt von der Situation ab. Oft ist der einfachste Ansatz der beste, weil er leicht zu verstehen ist:
oder
Aber manchmal ist es nützlich, eine Aufzählung anstelle eines booleschen Flags zu verwenden. Stellen Sie sich vor, es gibt synchrone und asynchrone Prozesse:
In Java kann enum zusätzliche Attribute und Methoden haben:
quelle
?:
ist, dass Sie Haltepunkte in die if-Blöcke einfügen können.Wenn Sie Apache Commons Lang verwenden (was meiner Meinung nach in vielen Projekten verwendet wird), können Sie es einfach so verwenden:
toInteger
Methode gibt 1 zurück, wennboolean_expression
true, andernfalls 0quelle
BooleanUtils.toInteger
wird als gerecht implementiertreturn bool ? 1 : 0;
.Wenn
true -> 1
undfalse -> 0
Mapping das ist, was Sie wollen, können Sie Folgendes tun:quelle
Wenn Sie verschleiern möchten, verwenden Sie Folgendes:
quelle
Lass uns einen Streich spielen
Boolean.compare(boolean, boolean)
. Standardverhalten der Funktion: Wenn beide Werte gleich sind, wird0
nichts anderes zurückgegeben-1
.Erläuterung : Wie wir wissen, ist die Standardrückgabe von Boolean.compare im Falle einer Fehlanpassung -1, sodass +1 den Rückgabewert auf 0 für
False
und 1 für setztTrue
quelle
Boolean.compare(myBoolean, false)
würde besser zu der zitierten Beschreibung passenDie Tatsache, dass ich eine Wrapper-Methode um eine if-Anweisung zum Umwandeln eines Werts schreiben muss, trägt nur zu der bereits riesigen Liste von Gründen bei, warum Java einfach schon sterben sollte. Und wenn ich sehe, dass der ternäre Operator nicht einmal in eine Funktion eingeschlossen ist, sondern nur überall kopiert wird, sehe ich eine boolesche Umwandlung in int, die mich nur verrückt macht. Es ist eine Verschwendung von CPU-Zyklen und eine Beleidigung der Lesbarkeit des Codes.
Außerdem haben die meisten Antworten hier Hunderte von Upvotes ohne Erklärung, was mich vermuten lässt, dass schlechte Praktiken nur darauf zurückzuführen sind, dass man so viel Java ausgesetzt ist. Wenn ich einen ternären Operator schreiben würde, um Boolesche Werte in einer modernen Sprache in int umzuwandeln, würde ich am nächsten Tag von jedem Job entlassen, den ich haben könnte. Deshalb habe ich heute aufgegeben, Vernunft für meine Java-Aufgaben einzusetzen, und mich entschlossen, Dummheit anzunehmen:
quelle
Dann benutze :
quelle