Boolean.parseBoolean ("1") = false ...?


77

вибачте за біль ... у мене: HashMap<String, String> o

o.get('uses_votes'); // "1"

Але ...

Boolean.parseBoolean(o.get('uses_votes')); // "false"

Я здогадуюсь, що ....parseBooleanне приймає стандарт 0 = false 1 = true?

Я роблю щось не так, або мені доведеться обернути свій код:

boolean uses_votes = false;
if(o.get('uses_votes').equals("1")) {
    uses_votes = true;
}

Дякую

Відповіді:


89

Він приймає лише рядкове значення, "true"яке представляє логічне значення true. Найкраще, що ви можете зробити, це

boolean uses_votes = "1".equals(o.get("uses_votes"));

Або якщо Mapнасправді представляє "entitiy", я думаю, що Javabean набагато кращий. Або якщо він представляє налаштування конфігурації, можливо, ви захочете поглянути на конфігурацію Apache Commons .


2
ах це трохи сміття! добре, добре, це був не тільки я. Я скористаюся вашою пропозицією. :) Дякую
Томас Клейсон,

1
В ідеалі parseBoolean- через виняток, якщо він отримає щось інше, ніж trueабо false.
Гейб,

або це може бути трохи м’якше! Але так, я згоден - проблему було важко знайти.
Томас Клейсон,

3
@Gabe навпаки, Boolean.parseBoolean(java.lang.String)не кидає, Exceptionякщо отримає щось інше, ніж trueабо false. Він просто повертається falseкожного разу, коли отримує щось інше, ніж "true" або "TRUE" як рядок. grepcode
WarFox

1
@WarFox: Так, саме тому я сказав, що в ідеалі це призведе до винятку. Якби він накинув виняток на вхід, який він не розумів, ніколи не виникало б питання про те, чи правильно він проаналізований чи просто за замовчуванням false.
Гейб,

29

У мене є невелика утиліта для перетворення всіх можливих значень у логічні.

private boolean convertToBoolean(String value) {
    boolean returnValue = false;
    if ("1".equalsIgnoreCase(value) || "yes".equalsIgnoreCase(value) || 
        "true".equalsIgnoreCase(value) || "on".equalsIgnoreCase(value))
        returnValue = true;
    return returnValue;
}

10
Чому б просто не повернути "1" .equalsIgnoreCase (значення) || "так" .equalsIgnoreCase (значення) || "true" .equalsIgnoreCase (значення) || "on" .equalsIgnoreCase (значення);
Том Фрейзер

Порівняйте, як це робить Ansible: docs.ansible.com/ansible/YAMLSyntax.html#truthiness
Томас Гірш

Ваша пропозиція про вигляд здається дивною. Якщо можливі значення ввімкнені та вимкнені, це має сенс, але увімкнено не є остаточною істинною / помилковою ситуацією, як так / ні або 1/0. Що, якби мої можливі значення включені, наприклад, нижче, тоді ця логіка не спрацює. Однак я зазвичай намагаюся встановити свої логічні значення на стороні БД і просто використовую POJO для перетворення баз даних 1 і 0 в Java логічні.
jDub9

13

Згідно з документацією (курсив мій):

Розбирає аргумент рядка як логічний. Повернене логічне значення представляє значення true, якщо аргумент рядка не є нульовим і дорівнює, ігноруючи регістр, рядку "true" .


10

Якщо ви намагаєтеся зрозуміти поведінку C ( 0 == falseі все інше true), ви можете зробити це:

boolean uses_votes = Integer.parseInt(o.get("uses_votes")) != 0;

Ах, це цікава робота, так, я думаю, саме на цю поведінку я очікував. У цьому випадку я можу гарантувати, що результат буде 1 або 0, тому код BalusC працює бездоганно, однак я запам'ятаю це, оскільки це здається дуже корисним.
Thomas Clayson

4

Я знаю, що це стара тема, але як щодо запозичення із синтаксису C:

(o.get('uses_votes')).equals("1") ? true : false;

10
? true : falseБіт в кінці кінців , це добре відомо антипаттерн: це всього лише 14 додаткових символів , набрані без особливої причини, так як ліва сторона вже булева, і тестування , щоб вирішити , слід повертати trueабо falseнерозумно.
amalloy

Дякую за допомогу
Ятін Патель

3

Томасе, я думаю, що ваш код обгортки, або просто сама умова, є найчистішим способом зробити те, що ви хочете зробити у Java, тобто перетворити "1" у значення Boolean True. Насправді, порівняння з "0" і взяття зворотного відповідало б поведінці C, яка сприймає 0 як хибне, а все інше як істинне.

Boolean intStringToBoolean(numericBooleanValueString) {
  return !"0".equals(numericBooleanValueString);
}

2

Як примітка,
для тих, кому потрібно мати нульове значення для речей, крім рядків "true" або "false", ви можете використовувати функцію нижче

public Boolean tryParseBoolean(String inputBoolean)
{    
    if(!inputBoolean.equals("true")&&!inputBoolean.equals("false")) return null;
    return Boolean.valueOf(inputBoolean);
}

2

Повертає true, якщо приходить 'y', '1', 'true', 'on'або все, що ви додаєте подібним чином

boolean getValue(String value) {
  return ("Y".equals(value.toUpperCase()) 
      || "1".equals(value.toUpperCase())
      || "TRUE".equals(value.toUpperCase())
      || "ON".equals(value.toUpperCase()) 
     );
}

0

Java сильно набрана. 0 і 1 - це числа, що відрізняється від булевого. Число ніколи не буде рівним булевому.


2
технічно, у моїй реалізації вони є рядками! : p У будь-якому випадку, виходячи з фону php / javascript, я гадаю, я просто припустив, що він може розрізняти 0 і 1, увімкнути і вимкнути, так і ні, а також істинно і хибно належним чином.
Thomas Clayson

Ну, спочатку .. що таке змінна на даний момент не має значення в цьому контексті, оскільки вся мета полягає в перетворенні в логічну форму з чогось іншого. По-друге, ви припускаєте, що це цифри. Наприклад, якщо джерелом є рядок запиту, він насправді буде надходити як рядок рівно стільки, скільки буде "true" та "false".
Рікаел

0

У мене було те саме питання, і я вирішив його таким:

Boolean use_vote = o.get('uses_votes').equals("1") ? true : false;

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.