Чтобы дать некоторый контекст (другие ответы охватывают «способ Java», чтобы сделать это уже), понятие, что значение 0 - «ложь», обычно упоминается как «на этом языке, 0 - ложь» . В большинстве языков вещи являются правдивыми (если они используются в месте, где допустим только логический, он обрабатывается так же, как true
), если только они не находятся в явном списке falsy вещей.
Проблема в том, что языки не совпадают в списке. Это вызывает бесконечную путаницу. null
и undefined
(если язык имеет понятие) универсально ложны. Но после этого все усложняется. Пустая строка ложная? Пустой список? Как насчет пользовательского типа данных, который имеет опцию итератора, и если бы вы вызывали его, он не возвращал бы никаких элементов? Например, объект-селектор jQuery, который ссылается на 0 элементов DOM, это truey или falsy ?
Как насчет строки "0"
? Это действует как int 0 во многих местах, так должно ли оно быть ложным?
Даже более странно, в оболочках Linux (таких как /bin/bash
), ситуация с числами обратная;0 является правдой, а все остальные значения ложными. Это кажется нелепым, но на самом деле имеет смысл в пределах того, для чего предназначены bash и тому подобное: процессы могут возвращать один байт как «значение ошибки», а 0 - универсальный индикатор «нет ошибки»;все нормально », поэтому bash работает с обратными значениями« истина / ложь ». истинное совпадение с «без ошибок» и ложное совпадение с «некоторыми ошибками», что является разумным способом сделать это.
Что приводит нас к Java: Java решила, что несколько символов были сохранены, имея в языке истинность / ложьабсолютно никоим образом не стоит сложности и путаницы, которые повлекут за собой его добавление. Таким образом, Ява является абсолютной. true
это правда. false
это фальшивка. Все остальные значения, если они используются в логическом контексте, являются ошибкой компилятора.
То есть: нет, java не позволяет использовать someIntExpr || defaultValue
как быстрый способ переписать значение 0, и, что важно, никогда* будем. Попробуйте для этого someIntExpr == 0 ? defaultValue : someIntExpr
или интегрируйте его прямо в вызов API, поэтому вместо записи: someHashMap.get("someKey") || "default"
, который не является Java и не будет компилироваться, попробуйте: someHashMap.getOrDefault("someKey", "default")
. Это не единственный API Java, который имеет встроенную поддержку для передачи значений по умолчанию.
*) Мнения могут меняться, конечно, но давайте скажем так: чрезвычайно маловероятно, что достаточносообщество и основные коммиттеры передумали бы по этому поводу и позволили бы языковым изменениям ввести больше правдивых и ложных вещей.