Co całkowitymi można by pomyśleć odzwierciedlał truei falseodpowiednio?
Thorbjørn Ravn Andersen
4
Niektóre języki mają domyślną konwersję z int na boolean. Java nie. Jednak oficjalna implementacja zawiera pakiety SQL i uważam, że konwertują one „false” na 0.
hpique
4
@Peter Lawrey Nie, jeśli chcesz współpracować z innymi systemami, które nie mają wartości logicznych jako nieliczbowych typów danych.
hpique
6
@Peter Lawrey Pytanie tak naprawdę nie dotyczy mapowania wartości. Chodzi o to, jak wykonać konwersję w najbardziej przejrzysty, akceptowany sposób.
hpique
7
Technicznie kompilator Java już definiuje mapowanie. Prawda i fałsz są kompilowane odpowiednio do 1 i 0.
Korzystanie z operatora trójskładnikowego jest najprostszym, najbardziej wydajnym i najbardziej czytelnym sposobem na robienie tego, co chcesz. Zachęcam do skorzystania z tego rozwiązania.
Nie mogę się jednak oprzeć zaproponowaniu alternatywnego, przemyślanego, nieefektywnego i nieczytelnego rozwiązania.
int boolToInt(Boolean b){return b.compareTo(false);}
Hej, ludzie lubią głosować na takie fajne odpowiedzi!
Edytować
Nawiasem mówiąc, często widziałem konwersje z wartości logicznej na int wyłącznie w celu porównania dwóch wartości (ogólnie w implementacjach compareTometody). Boolean#compareTojest właściwą drogą w tych konkretnych przypadkach.
Edytuj 2
Java 7 wprowadziła nową funkcję narzędzia, która działa bezpośrednio z typami pierwotnymi Boolean#compare(Dzięki shmosel )
int boolToInt(boolean b){returnBoolean.compare(b,false);}
Zostaną wprowadzone przez nowoczesne JIT, więc niekoniecznie nieefektywne. Dokumentuje również, dlaczego używany jest b.compareTo, aby był czytelny.
Thorbjørn Ravn Andersen
2
Może to być powolne, ponieważ musimy zawrzeć pierwotną wartość w obiekcie. Metoda operatora trójskładnikowego działa bezpośrednio z wartościami pierwotnymi bez konwersji, więc myślę, że jest bardziej wydajna.
barjak
5
1. Możesz używać Boolean.compare()i unikać autoboxowania. 2. Dokumentacja dla Boolean.compareTo()nie mówi, że zwróci 1, a jedynie „wartość dodatnią, jeśli ten obiekt reprezentuje prawda, a argument reprezentuje fałsz”.
shmosel
1
Właśnie wykonałem test konwertujący 1 000 000 losowych wartości logicznych i ta metoda była konsekwentnie szybsza niż ta oparta na operatorze trójskładnikowym. Ogolił się około 10ms.
Myślę, że lepiej by to pasowało jako komentarz, a nie odpowiedź.
hpique
164
5 - b.toString().length
kennytm
5
@ ThorbjørnRavnAndersen Tak. Używanie jednej z innych, bardziej wydajnych, opublikowanych metod, które nie wymagają tego narzutu. Chyba że możesz wyjaśnić, w jaki sposób tworzenie obiektów ciągów w celu sprawdzenia wartości logicznej jest w jakikolwiek sposób wydajne.
b1nary.atr0phy
10
@ ThorbjørnRavnAndersen Nie mam kontroli nad tym, jak używane są moje metody i jak często są one wywoływane, co jest całkowicie kwestią. Poświęcasz zarówno wydajność, jak i czytelność, co absolutnie nie przynosi wymiernych korzyści.
b1nary.atr0phy
6
Jest to zdecydowanie kreatywne, ale nie mogę wymyślić żadnej korzyści z zastosowania tej metody. Jest bardziej szczegółowy i (wydaje mi się) mniej wydajny, ale z pewnością jest interesującą metodą.
Objaśnienie : Jak wiemy, domyślnym zwróceniem Boolean.compare jest -1 w przypadku niepoprawnego dopasowania, więc +1 ustaw wartość zwracaną na 0 dla Falsei 1 dlaTrue
Boolean.compare(myBoolean, false)lepiej pasowałoby do cytowanego opisu
Vadzim
@Vadzim Tak rzeczywiście wygeneruje 1 i 0, porównując z fałszem, aw obecnym scenariuszu wygeneruje 0 i -1. Oba rozwiązania są w porządku, a +1 za komentarz :-)
mumair
0
Fakt, że muszę napisać metodę otoki wokół instrukcji if do rzutowania wartości, dodaje do i tak już ogromnej listy powodów, dla których java powinna po prostu umrzeć. I widząc, że operator trójskładnikowy nie jest nawet zawinięty w funkcję, ale po prostu kopiuje wklejony wszędzie, widzę boolowską obsadę po prostu doprowadza mnie do szału. Jest to strata cykli procesora i zniewaga dla czytelności kodu.
Również większość odpowiedzi tutaj ma setki pozytywnych opinii z zerowym wyjaśnieniem, co sprawia, że zgaduję, że zła praktyka jest tylko wynikiem tak częstego narażenia na java. Gdybym napisał trójskładnikowego operatora do przesyłania wartości logicznej na int w jakimkolwiek współczesnym języku, zostałbym zwolniony następnego dnia z jakiejkolwiek pracy, jaką miałem. Więc dzisiaj zrezygnowałem z prób wykorzystania rozumu przy moich zadaniach java i postanowiłem przyjąć głupotę:
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
ifalse
odpowiednio?Odpowiedzi:
^^
PS: prawda = 1 i fałsz = 0
źródło
(foo && (!bar || baz)) ? 1 : 0
. Oczywiście, jeśli jest to tylko identyfikator, pareny nie są konieczne ani pożądane.(boolean expression) ? 1 : 0;
byłoby bardziej zrozumiałe. Myślę, żemy
przedrostek wyglądał jak zmienna.foo && (!bar || baz) ? 1 : 0
byłby błąd składniowy. (Wiem, że minęło 6 lat)źródło
Korzystanie z operatora trójskładnikowego jest najprostszym, najbardziej wydajnym i najbardziej czytelnym sposobem na robienie tego, co chcesz. Zachęcam do skorzystania z tego rozwiązania.
Nie mogę się jednak oprzeć zaproponowaniu alternatywnego, przemyślanego, nieefektywnego i nieczytelnego rozwiązania.
Hej, ludzie lubią głosować na takie fajne odpowiedzi!
Edytować
Nawiasem mówiąc, często widziałem konwersje z wartości logicznej na int wyłącznie w celu porównania dwóch wartości (ogólnie w implementacjach
compareTo
metody).Boolean#compareTo
jest właściwą drogą w tych konkretnych przypadkach.Edytuj 2
Java 7 wprowadziła nową funkcję narzędzia, która działa bezpośrednio z typami pierwotnymi
Boolean#compare
(Dzięki shmosel )źródło
Boolean.compare()
i unikać autoboxowania. 2. Dokumentacja dlaBoolean.compareTo()
nie mówi, że zwróci 1, a jedynie „wartość dodatnią, jeśli ten obiekt reprezentuje prawda, a argument reprezentuje fałsz”.źródło
5 - b.toString().length
prosty
źródło
źródło
BooleanUtils.toInteger
jest zaimplementowany jako sprawiedliwyreturn bool ? 1 : 0;
.To zależy od sytuacji. Często najprostsze podejście jest najlepsze, ponieważ jest łatwe do zrozumienia:
lub
Ale czasami warto użyć Enum zamiast flagi boolowskiej. Wyobraźmy sobie, że istnieją procesy synchroniczne i asynchroniczne:
W Javie wyliczanie może mieć dodatkowe atrybuty i metody:
źródło
?:
jest to, że możesz wstawić punkty przerwania wewnątrz bloków if.Jeśli używasz Apache Commons Lang (który, jak sądzę, używa go wiele projektów), możesz po prostu użyć go w następujący sposób:
toInteger
metoda zwraca 1, jeśliboolean_expression
jest prawdą, 0 w przeciwnym razieźródło
BooleanUtils.toInteger
jest zaimplementowany jako sprawiedliwyreturn bool ? 1 : 0;
.Jeśli
true -> 1
ifalse -> 0
mapowanie jest tym, czego chcesz, możesz:źródło
Jeśli chcesz zaciemnić, użyj tego:
źródło
Pozwala zagrać z trikiem
Boolean.compare(boolean, boolean)
. Domyślne zachowanie funkcji: jeśli obie wartości są równe, w0
przeciwnym razie zwraca-1
.Objaśnienie : Jak wiemy, domyślnym zwróceniem Boolean.compare jest -1 w przypadku niepoprawnego dopasowania, więc +1 ustaw wartość zwracaną na 0 dla
False
i 1 dlaTrue
źródło
Boolean.compare(myBoolean, false)
lepiej pasowałoby do cytowanego opisuFakt, że muszę napisać metodę otoki wokół instrukcji if do rzutowania wartości, dodaje do i tak już ogromnej listy powodów, dla których java powinna po prostu umrzeć. I widząc, że operator trójskładnikowy nie jest nawet zawinięty w funkcję, ale po prostu kopiuje wklejony wszędzie, widzę boolowską obsadę po prostu doprowadza mnie do szału. Jest to strata cykli procesora i zniewaga dla czytelności kodu.
Również większość odpowiedzi tutaj ma setki pozytywnych opinii z zerowym wyjaśnieniem, co sprawia, że zgaduję, że zła praktyka jest tylko wynikiem tak częstego narażenia na java. Gdybym napisał trójskładnikowego operatora do przesyłania wartości logicznej na int w jakimkolwiek współczesnym języku, zostałbym zwolniony następnego dnia z jakiejkolwiek pracy, jaką miałem. Więc dzisiaj zrezygnowałem z prób wykorzystania rozumu przy moich zadaniach java i postanowiłem przyjąć głupotę:
źródło
Następnie użyj:
źródło