检查“int”类型的“boolean”结果

34

我正在学习Java,之前学过C语言。我发现两种语言之间有一个有趣的差异,那就是在Java中有一种叫做boolean的类型,在C语言中则没有bool/ean类型,所以我们需要使用数字类型来表示布尔逻辑(0 == false)。

我猜在Java中这样行不通:

int i = 1;
if (i)
    System.out.println("i is true");

即使通过类型转换改变条件也不行:

if ((boolean)i)

所以除了像这样做:

if ( i != 0 )

有没有其他方法来执行类似C的逻辑检查,但针对int类型?我只是想知道是否有Java的技巧允许在非布尔类型上进行布尔逻辑操作。


编辑:
上面的示例非常简单,容易导致狭隘的思维。当我最初提出问题时,我也在考虑从函数调用返回的非布尔值。例如Linux的fork()调用。它并不直接返回一个int,但我可以将数字返回值用于条件语句,如下所示:

if( fork() ) {
    // do child code

这使得我能够处理子进程中的条件代码,而不对父进程进行处理(或在出现错误的情况下返回负结果)。

所以我现在还不了解足够的Java知识来提供一个好的“Java”示例,但那是我的最初意图。


11
不。 - tckmn
2
@sampson-chen - 这是从布尔型转换为整型,我的是从整型转换为布尔型... 或者你认为这个问题是一样的吗? - Mike
1
@Mike 哎呀,对不起;那是我的错误。 - sampson-chen
2
在 C 语言中没有 bool 类型 - 呃,实际上是有的 - BlueRaja - Danny Pflughoeft
3
在C语言中,如果不包含< bool.h >头文件,则标准类型不包括“bool”类型。 - Mike
显示剩余9条评论
9个回答

51

在Java中,

if ( i != 0 )

使用i != 0是检查整数i是否与不同的惯用方式。

如果i用作标志,应该是boolean类型而不是int类型。


1
明白了,我想我得习惯于写那些额外的 (!=) 字符了...谢谢! - Mike
9
我认为真正的成语是使用布尔值。上述代码让我感到不适,个人看法。 - Brian Agnew
7
当你只涉及逻辑时,请使用布尔值; 当存在实际有意义的数字时,请使用!= 0 - Louis Wasserman
如何使用(n & 1)来检查一个数是偶数还是奇数?在末尾加上==!=0即可。 - AgentM

6

尝试使用来自Apache common-langBooleanUtils

  BooleanUtils.toBoolean(0) = Boolean.FALSE
  BooleanUtils.toBoolean(1) = Boolean.TRUE
  BooleanUtils.toBoolean(2) = Boolean.TRUE

6
为什么不使用布尔类型?这将按预期工作,而不会出现可能存在的整数/布尔混淆问题。
private boolean isValid;
...
if (!isValid) {
   ...
}

请注意,这是Java惯用的方法。第三方库使用它,您API的用户也将使用并期望它。我希望您使用的库会给您布尔值,因此您只是将整数视为布尔值

在这个简单的例子中,我可以这样做。在更复杂的代码中,我知道我会本能地想要使用int作为布尔值,因为我已经这样做了很多年...只是想知道在Java中是否有任何语法上的方法可以允许它,或者我是否只需要习惯这种情况。 - Mike
8
我会尝试满足你的本能冲动!一个整数和布尔值是不同的,如果你使用整数,总有一天你会向其中放入一个意外的值。 - Brian Agnew
如果你使用整数,总有一天你会将一个意外的值放入其中,这是完全正确的。并且因为这个原因我给你加了一个赞。然而,我所思考的更多的是函数调用的返回值。我暂时没有一个好的“Java”例子,但我想到的是Linux的fork(),如果我不关心结果的值,我可以说if(fork())来覆盖失败的分支和父进程,并且条件语句内部的代码只是子进程的。我喜欢能够这样做,即使它可能不太易读。 - Mike
7
@Mike:Java 不是 C。方法应该在成功时返回一个值并在失败时抛出异常。 请不要使用 int 作为返回类型,除非您计划返回实际数字... (翻译): @Mike:Java 和 C 不同。 方法应该在成功时返回一个值,并在失败时抛出异常。 请勿将 int 用作返回类型,除非您打算返回实际数字... - thkala
2
@thkala 是正确的,在 Java 环境中,其他开发人员会期望在失败的情况下抛出异常,而不是返回“魔数”;在调用堆栈中可以捕获异常,而不是检查特定的魔数。有些约定在语言之间无法转移,这是由于语言规范(整数没有隐式布尔表示)或语言中的附加功能(已检查异常)。 - Matt

3

来自 JLS:

布尔类型有两个值,用ASCII字母表示 true 和 false。

因此,否定是答案。唯一的方法是

if ( i != 0 )

不错的链接... Oracle 是“官方”的 Java 文档的保管者? - Mike
1
@Mike - 是的。Sun被Oracle收购了。 - Brian Agnew

2

在Java中,条件必须是布尔类型,否则它不能成为表达式,这就是为什么。

if( i ) 

不被允许。

它必须是真或假。


0

如果你坚持使用int而不是布尔值,只需使用一个方法进行转换即可。

class BooleanHelper
{
   public static boolean toBoolean (int pVal) {
      return pVal != 0;
   }
 ...
}

// apply

if (BooleanHelper.toBoolean(i)) { // BooleanHelper could be avoided using static imports...

然而,只需使用

if (i != 0) {

仍然更短更清晰。


“is still shorter and clearer.” 确实如此,但我喜欢“helper”函数的概念,给它加1分。谢谢。 - Mike
4
天哪,不要走这条路!会陷入疯狂的深渊!(文章链接:http://us.thedailywtf.com/Articles/Comparejava.aspx) - Izkata

0

如果您想保留语义,可以创建自己的枚举。实际上,您只需要一个单值枚举,然后可以直接比较其序数位置。

enum bool{FALSE};

if(i != bool.FALSE.ordinal()){
   //true case logic
   }
else{ //false case logic
   }

0
你可以尝试这样做: 布尔值 i = true; if (i) System.out.println("i is true");
只需将其初始化为布尔值而不是整数即可。

-1
可能是这样的: 或者反过来:

...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接