【问题标题】:Convert boolean to int in Java在Java中将布尔值转换为int
【发布时间】:2011-04-17 03:47:03
【问题描述】:

在 Java 中将boolean 转换为int 的最常用方法是什么?

【问题讨论】:

  • 你认为truefalse分别对应哪些整数?
  • 某些语言有从 int 到 boolean 的隐式转换。 Java没有。但是,官方实现有 SQL 包,我相信这些将“false”转换为 0。
  • @Peter Lawrey 如果您想与其他没有布尔作为非数字数据类型的系统进行互操作,请不要这样做。
  • @Peter Lawrey 问题实际上与价值映射无关。它是关于如何以最清晰、最被接受的方式进行转换。
  • 从技术上讲,Java 编译器已经定义了一个映射。 True 和 False 分别编译为 1 和 0。

标签: java casting boolean int


【解决方案1】:
int myInt = myBoolean ? 1 : 0;

^^

PS:真 = 1 假 = 0

【讨论】:

  • 在 myBoolean 代表布尔表达式的情况下,使用括号更具可读性。
  • 是的,如(foo && (!bar || baz)) ? 1 : 0。显然,如果它只是一个标识符,则括号不是必需的或不可取的。
  • 对于像我这样的初学者,(boolean expression) ? 1 : 0; 会更容易理解。我认为my 前缀使它看起来像一个变量。
  • @Blrfl 在您的示例括号中是必须,而不是可读性问题。 foo && (!bar || baz) ? 1 : 0 将是一个语法错误。 (我知道已经 6 年了)
  • 现在有了更多的真相 int myInt = myBoolean ? ~0 : 0
【解决方案2】:
int val = b? 1 : 0;

【讨论】:

    【解决方案3】:

    使用三元运算符是做你想做的最简单、最有效、最易读的方法。我鼓励您使用此解决方案。

    但是,我忍不住要提出一个替代的、人为的、低效的、不可读的解决方案。

    int boolToInt(Boolean b) {
        return b.compareTo(false);
    }
    

    嘿,人们喜欢为这么酷的答案投票!

    编辑

    顺便说一句,我经常看到从 boolean 到 int 的转换,其唯一目的是比较两个值(通常在 compareTo 方法的实现中)。 Boolean#compareTo 是在这些特定情况下要走的路。

    编辑 2

    Java 7 引入了一个新的实用函数,可以直接处理原始类型,Boolean#compare(感谢 shmosel

    int boolToInt(boolean b) {
        return Boolean.compare(b, false);
    }
    

    【讨论】:

    • 将被现代 JIT 内联,因此不一定效率低下。它还记录了使用 b.compareTo 的原因,因此它是可读的。
    • 它可能很慢,因为我们需要将原始值装箱到一个对象中。三元运算符方法直接处理原始值,无需转换,所以我认为它更有效。
    • 1.您可以使用Boolean.compare() 并避免自动装箱。 2.Boolean.compareTo() 的文档并没有说它会返回 1,只是“如果这个对象代表真而参数代表假,则返回一个正值”。
    • 我刚刚做了一个转换 1,000,000 个随机布尔值的测试,这种方法始终比基于三元运算符的方法快。它剃掉了大约 10 毫秒。
    • @AlexT。如果您进行微基准测试,您应该使用一个框架来确保您正确测量。见openjdk.java.net/projects/code-tools/jmh
    【解决方案4】:
    boolean b = ....; 
    int i = -("false".indexOf("" + b));
    

    【讨论】:

    • 我认为这更适合作为评论,而不是答案。
    • @ThorbjørnRavnAndersen 是的。使用发布的其他更有效的方法之一,不需要该开销。除非你能解释创建字符串对象来简单地检查布尔值是如何有效的。
    • @b1naryatr0phy 您正在过早地进行微优化。
    • @ThorbjørnRavnAndersen 我无法控制我的方法的使用方式或调用频率,这完全是重点。你牺牲了性能和可读性,却没有任何实际的好处。
    • 这绝对是有创意的,但我想不出使用这种方法有什么好处。它更冗长,而且(我猜)效率较低,但它确实是一种有趣的方法。
    【解决方案5】:
    public int boolToInt(boolean b) {
        return b ? 1 : 0;
    }
    

    简单

    【讨论】:

      【解决方案6】:
      import org.apache.commons.lang3.BooleanUtils;
      boolean x = true;   
      int y= BooleanUtils.toInteger(x);
      

      【讨论】:

      • FWIW,BooleanUtils.toInteger 被实现为 return bool ? 1 : 0;
      • Apache Commons 可能很有用,但这太荒谬了。
      • @EricDuminil 这可以稍微提高嵌套 (? :) 或长单行的可读性。
      • @EricDuminil IMO xyz.stream().map(BooleanUtils::toInteger)xyz.stream().map(x -> x ? 1 : 0) 更具可读性
      • @bb1950328:是的,它更具可读性,但它与 Apache Commons 没有任何关系。您可以简单地使用stackoverflow.com/a/3794521/6419007 中定义的方法。
      【解决方案7】:

      如果你使用Apache Commons Lang(我认为很多项目都使用它),你可以像这样使用它:

      int myInt = BooleanUtils.toInteger(boolean_expression); 
      

      toInteger 方法在 boolean_expression 为真时返回 1,否则返回 0

      【讨论】:

      • FWIW,BooleanUtils.toInteger 被实现为 return bool ? 1 : 0;
      【解决方案8】:

      这取决于情况。通常最简单的方法是最好的,因为它很容易理解:

      if (something) {
          otherThing = 1;
      } else {
          otherThing = 0;
      }
      

      int otherThing = something ? 1 : 0;
      

      但有时使用枚举而不是布尔标志很有用。假设有同步和异步进程:

      Process process = Process.SYNCHRONOUS;
      System.out.println(process.getCode());
      

      在Java中,枚举可以有额外的属性和方法:

      public enum Process {
      
          SYNCHRONOUS (0),
          ASYNCHRONOUS (1);
      
          private int code;
          private Process (int code) {
              this.code = code;
          }
      
          public int getCode() {
              return code;
          }
      }
      

      【讨论】:

      • 使用 if 而不是 ?: 的另一个原因是您可以在 if 块中放置断点。
      【解决方案9】:

      如果true -> 1false -> 0 映射是您想要的,您可以这样做:

      boolean b = true;
      int i = b ? 1 : 0; // assigns 1 to i.
      

      【讨论】:

        【解决方案10】:

        如果你想混淆,使用这个:

        System.out.println( 1 & Boolean.hashCode( true ) >> 1 );  // 1
        System.out.println( 1 & Boolean.hashCode( false ) >> 1 ); // 0
        

        【讨论】:

          【解决方案11】:

          让我们和Boolean.compare(boolean, boolean) 玩花样。函数的默认行为:如果两个值相等则返回0,否则返回-1

          public int valueOf(Boolean flag) {
             return Boolean.compare(flag, Boolean.TRUE) + 1;
          }
          

          解释:我们知道 Boolean.compare 的默认返回是 -1 以防不匹配,所以 +1 使 False 的返回值为 01 代表True

          【讨论】:

          • Boolean.compare(myBoolean, false) 更适合引用的描述
          • @Vadzim Yes 确实会通过与 false 比较生成 1 和 0,并且在当前场景中它将生成 0 和 -1。两种解决方案都很好,您的评论 +1 :-)
          【解决方案12】:
          public static int convBool(boolean b)
          {
          int convBool = 0;
          if(b) convBool = 1;
          return convBool;
          }
          

          然后使用:

          convBool(aBool);
          

          【讨论】:

            猜你喜欢
            • 2015-09-27
            • 2012-02-25
            • 1970-01-01
            • 1970-01-01
            • 2015-05-13
            • 2016-11-21
            • 2014-10-11
            • 1970-01-01
            相关资源
            最近更新 更多