Java:将原始布尔值转换为原始int(0,1)的好方法

Java:将原始布尔值转换为原始int(0,1)的好方法,java,type-conversion,Java,Type Conversion,我知道应该很简单,但是 我有原语java布尔值 我相信这样简单的事情不需要额外的方法编码 我非常不喜欢三元运算符和内联条件(?,对于那些想要声誉并试图回答任何问题(即使不阅读问题)的人)。所以(值?1:0)不适合我 我不能使用像value.compareTo(false)这样的好片段,因为它是原语 我想要得到的是类似于最后一点的东西,但是对于基本体。 惊讶的是没有好的方法来做这样一个简单有用的转换?让我来。你的谷歌比我的大吗-D 更新: 好的,最后我决定为这种情况编写我自己的方法,因为这里不

我知道应该很简单,但是

  • 我有原语java布尔值
  • 我相信这样简单的事情不需要额外的方法编码
  • 我非常不喜欢三元运算符和内联条件(
    ,对于那些想要声誉并试图回答任何问题(即使不阅读问题)的人)。所以
    (值?1:0)
    不适合我
  • 我不能使用像
    value.compareTo(false)
    这样的好片段,因为它是
    原语
我想要得到的是类似于最后一点的东西,但是对于基本体。 惊讶的是没有好的方法来做这样一个简单有用的转换?让我来。你的谷歌比我的大吗-D

更新:


好的,最后我决定为这种情况编写我自己的方法,因为这里不仅有类型转换,还有一些逻辑可以在将来扩展,我想把它封装起来。感谢所有参与的人。

没有好办法。一个额外的函数定义并没有那么糟糕。如果您不喜欢三元函数,只需定义一个函数:

int bool_to_int(boolean mybool) {
    if (mybool)
        return 1;
    return 0;
}

如果您不能严格地使用
value.compareTo(false)
,因为它是原语,那么

Boolean.valueOf(value).compareTo(Boolean.FALSE);

使用三元运算符是实现所需操作的最简单、最有效和最可读的方法。我鼓励您使用此解决方案

int boolToInt(Boolean b) {
    return b.compareTo(false);
}
然而,我忍不住要提出一个替代的、人为的、低效的、不可读的解决方案

int boolToInt(Boolean b) {
    return b.compareTo(false);
}
这个怎么样

boolean x = true;

System.out.println(Boolean.compare(x, false));
通道编号2

System.out.println(5 - Boolean.toString(x).length());
路数3(更长):


好的,最后这是我发现的最好的东西:

public class Main {

    public static int resultCode(final boolean flag) {
        return Boolean.compare(flag, false);
    }

    public static void main(final String[] args) {
        boolean v1 = false;
        boolean v2 = true;
        System.out.println(v1 + " > " + resultCode(v1));
        System.out.println(v2 + " > " + resultCode(v2));
    }
}

这里有一些关于你的方法的想法——它们都很令人兴奋,因为它们远比
b复杂?1:0

int bi1(boolean b) {
    // The number of items in a set containing both false and the value
    Set<Boolean> s = new HashSet<Boolean>();
    s.add(b);
    s.add(false);
    return s.size() - 1;
}

int bi2(boolean b) {
    // Side-effect usage.
    int bi = 0;
    boolean x = (b && (bi = 1) == 0);
    return bi;
}

int bi3(boolean b) {
    // Using Compareto in a gratuitously obscure way.
    return (int) Math.signum(("" + b).compareTo(Boolean.FALSE.toString()));
}

int bi4(boolean b) {
    // A twiddle too far.
    return ((int) ("" + !b).charAt(0)) >> 1 & 1;
}

int bi5(boolean b) {
    // The old if heave
    if (b) {
        return 1;
    } else {
        return 0;
    }
}

static final List<Boolean> ltf = Arrays.asList(false, true);

int bi6(boolean b) {
    // List twiddling.
    return ltf.indexOf(b);
}
int bi1(布尔b){
//包含false和value的集合中的项数
Set s=新的HashSet();
s、 添加(b);
s、 添加(假);
返回s.size()-1;
}
int bi2(布尔b){
//副作用使用。
int-bi=0;
布尔x=(b&&(bi=1)==0);
返回bi;
}
int bi3(布尔b){
//以一种毫无意义的模糊方式使用Compareto。
return(int)Math.signum((“”+b).compareTo(Boolean.FALSE.toString());
}
int bi4(布尔b){
//玩弄得太过分了。
返回((int)(“”+!b).charAt(0))>>1&1;
}
int bi5(布尔b){
//老年人如果呕吐
如果(b){
返回1;
}否则{
返回0;
}
}
静态最终列表ltf=Arrays.asList(false,true);
int bi6(布尔b){
//列表旋转。
返回ltf.indexOf(b);
}

您还想要多少?

为什么不喜欢三元运算符?与三元运算符相关的问题很多。对我来说,这已经足够了,我所有的分析人员都不喜欢它,并且增加了太多的代码复杂性度量。@RomanNikitchenko不比if语句更重要,你不也使用它们吗?你使用的是哪种分析工具?这个怎么样?他们提到也没有创建额外的方法。除了使用三元法之外,没有其他方法。至少这看起来更干净。当然有,三元运算符;它不需要方法调用就能做到这一点,我就是这么说的。但是如果他不喜欢三元的话,这看起来更干净。虽然值得注意的是Oracle JDK的这种方法的实现使用了三元运算符。总比没有好引导看起来太长。没有标准的方法吗?有。它是
inti=value?1 : 0;
@Roman我还应该指出,
compareTo
在Oracle实现中也使用了三元运算符。这取决于
Boolean.compareTo()
的实现,-
compareTo()
的规范只要求在大于或小于比较时返回正值或负值。在未来,这在理论上可以返回任何
>0
你会发现它是用两个三元运算符实现的:
return(x==y)?0:(x?1:-1)